From 97d0286b57743fc60bd23d903a9ba564693dd675 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Thu, 17 Jun 2021 11:05:43 +1000 Subject: [PATCH] Uncached schedule recalculation is now twice as fast --- .../bim/module/sequence/operator.py | 10 +-- .../api/sequence/recalculate_schedule.py | 69 +++++++++++++------ 2 files changed, 49 insertions(+), 30 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/sequence/operator.py b/src/blenderbim/blenderbim/bim/module/sequence/operator.py index 31f1b1add1..1415f4f049 100644 --- a/src/blenderbim/blenderbim/bim/module/sequence/operator.py +++ b/src/blenderbim/blenderbim/bim/module/sequence/operator.py @@ -1484,9 +1484,7 @@ class VisualiseWorkScheduleDateRange(bpy.types.Operator): obj.keyframe_insert(data_path="color", frame=product_frame["COMPLETED"]) def animate_destruction(self, obj, product_frame): - obj.hide_viewport = False obj.color = (1.0, 1.0, 1.0, 1) - obj.keyframe_insert(data_path="hide_viewport", frame=self.start_frame) obj.keyframe_insert(data_path="color", frame=self.start_frame) obj.keyframe_insert(data_path="color", frame=product_frame["STARTED"] - 1) obj.color = (1.0, 0.0, 0.0, 1) @@ -1516,9 +1514,7 @@ class VisualiseWorkScheduleDateRange(bpy.types.Operator): obj.keyframe_insert(data_path="color", frame=product_frame["COMPLETED"]) def animate_movement_from(self, obj, product_frame): - obj.hide_viewport = False obj.color = (1.0, 1.0, 1.0, 1) - obj.keyframe_insert(data_path="hide_viewport", frame=self.start_frame) obj.keyframe_insert(data_path="color", frame=self.start_frame) obj.keyframe_insert(data_path="color", frame=product_frame["STARTED"] - 1) obj.color = (1.0, 0.5, 0.0, 1) @@ -1529,9 +1525,7 @@ class VisualiseWorkScheduleDateRange(bpy.types.Operator): obj.keyframe_insert(data_path="hide_viewport", frame=product_frame["COMPLETED"]) def animate_consumption(self, obj, product_frame): - obj.hide_viewport = False obj.color = (1.0, 1.0, 1.0, 1) - obj.keyframe_insert(data_path="hide_viewport", frame=self.start_frame) obj.keyframe_insert(data_path="color", frame=self.start_frame) obj.keyframe_insert(data_path="color", frame=product_frame["STARTED"] - 1) obj.color = (0.0, 1.0, 1.0, 1) @@ -1605,9 +1599,7 @@ class VisualiseWorkScheduleDateRange(bpy.types.Operator): "type": task.PredefinedType, "relationship": relationship, "STARTED": round(self.start_frame + (((start - self.start) / self.duration) * self.total_frames)), - "COMPLETED": round( - self.start_frame + (((finish - self.start) / self.duration) * self.total_frames) - ), + "COMPLETED": round(self.start_frame + (((finish - self.start) / self.duration) * self.total_frames)), } ) diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/recalculate_schedule.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/recalculate_schedule.py index 06e5b8af99..c284e72ba2 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/recalculate_schedule.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/recalculate_schedule.py @@ -146,26 +146,38 @@ class Usecase: finish = predecessor_data.get("early_finish") if finish is None: return - starts.append(self.offset_date(finish, edge["lag_time"], data)) - starts.append(self.offset_date(finish, edge["lag_time"], predecessor_data)) + if not edge["lag_time"]: + starts.append(finish) + else: + starts.append(self.offset_date(finish, edge["lag_time"], data)) + starts.append(self.offset_date(finish, edge["lag_time"], predecessor_data)) elif edge["type"] == "SS": start = predecessor_data.get("early_start") if start is None: return - starts.append(self.offset_date(start, edge["lag_time"], data)) - starts.append(self.offset_date(start, edge["lag_time"], predecessor_data)) + if not edge["lag_time"]: + starts.append(start) + else: + starts.append(self.offset_date(start, edge["lag_time"], data)) + starts.append(self.offset_date(start, edge["lag_time"], predecessor_data)) elif edge["type"] == "FF": finish = predecessor_data.get("early_finish") if finish is None: return - finishes.append(self.offset_date(finish, edge["lag_time"], data)) - finishes.append(self.offset_date(finish, edge["lag_time"], predecessor_data)) + if not edge["lag_time"]: + finishes.append(finish) + else: + finishes.append(self.offset_date(finish, edge["lag_time"], data)) + finishes.append(self.offset_date(finish, edge["lag_time"], predecessor_data)) elif edge["type"] == "SF": start = predecessor_data.get("early_start") if start is None: return - finishes.append(self.offset_date(start, edge["lag_time"], data)) - finishes.append(self.offset_date(start, edge["lag_time"], predecessor_data)) + if not edge["lag_time"]: + finishes.append(start) + else: + finishes.append(self.offset_date(start, edge["lag_time"], data)) + finishes.append(self.offset_date(start, edge["lag_time"], predecessor_data)) if starts and finishes: data["early_start"] = max(starts) data["early_finish"] = max(finishes) @@ -205,8 +217,11 @@ class Usecase: start = successor_data.get("late_start") if start is None: return - finishes.append(self.offset_date(start, -edge["lag_time"], data)) - finishes.append(self.offset_date(start, -edge["lag_time"], successor_data)) + if not edge["lag_time"]: + finishes.append(start) + else: + finishes.append(self.offset_date(start, -edge["lag_time"], data)) + finishes.append(self.offset_date(start, -edge["lag_time"], successor_data)) free_floats.append( self.calculate_free_float( data["early_finish"], successor_data["early_start"], edge["lag_time"], data, successor_data @@ -216,8 +231,11 @@ class Usecase: start = successor_data.get("late_start") if start is None: return - starts.append(self.offset_date(start, -edge["lag_time"], data)) - starts.append(self.offset_date(start, -edge["lag_time"], successor_data)) + if not edge["lag_time"]: + starts.append(start) + else: + starts.append(self.offset_date(start, -edge["lag_time"], data)) + starts.append(self.offset_date(start, -edge["lag_time"], successor_data)) free_floats.append( self.calculate_free_float( data["early_start"], successor_data["early_start"], edge["lag_time"], data, successor_data @@ -227,8 +245,11 @@ class Usecase: finish = successor_data.get("late_finish") if finish is None: return - finishes.append(self.offset_date(finish, -edge["lag_time"], data)) - finishes.append(self.offset_date(finish, -edge["lag_time"], successor_data)) + if not edge["lag_time"]: + finishes.append(finish) + else: + finishes.append(self.offset_date(finish, -edge["lag_time"], data)) + finishes.append(self.offset_date(finish, -edge["lag_time"], successor_data)) free_floats.append( self.calculate_free_float( data["early_finish"], successor_data["early_finish"], edge["lag_time"], data, successor_data @@ -238,8 +259,11 @@ class Usecase: finish = successor_data.get("late_finish") if finish is None: return - starts.append(self.offset_date(finish, -edge["lag_time"], data)) - starts.append(self.offset_date(finish, -edge["lag_time"], successor_data)) + if not edge["lag_time"]: + starts.append(finish) + else: + starts.append(self.offset_date(finish, -edge["lag_time"], data)) + starts.append(self.offset_date(finish, -edge["lag_time"], successor_data)) free_floats.append( self.calculate_free_float( data["early_start"], successor_data["early_finish"], edge["lag_time"], data, successor_data @@ -278,12 +302,15 @@ class Usecase: return True def calculate_free_float(self, predecessor_date, successor_date, lag_time, predecessor_data, successor_data): - min_successor_date = min( - ( - self.offset_date(successor_date, -lag_time, predecessor_data), - self.offset_date(successor_date, -lag_time, successor_data), + if not lag_time: + min_successor_date = successor_date + else: + min_successor_date = min( + ( + self.offset_date(successor_date, -lag_time, predecessor_data), + self.offset_date(successor_date, -lag_time, successor_data), + ) ) - ) if predecessor_data["duration_type"] == "WORKTIME": return datetime.timedelta( days=ifcopenshell.util.sequence.count_working_days(