Uncached schedule recalculation is now twice as fast

This commit is contained in:
Dion Moult
2021-06-17 11:05:43 +10:00
parent 2a7fbea9c3
commit 97d0286b57
2 changed files with 49 additions and 30 deletions
@@ -1484,9 +1484,7 @@ class VisualiseWorkScheduleDateRange(bpy.types.Operator):
obj.keyframe_insert(data_path="color", frame=product_frame["COMPLETED"]) obj.keyframe_insert(data_path="color", frame=product_frame["COMPLETED"])
def animate_destruction(self, obj, product_frame): def animate_destruction(self, obj, product_frame):
obj.hide_viewport = False
obj.color = (1.0, 1.0, 1.0, 1) 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=self.start_frame)
obj.keyframe_insert(data_path="color", frame=product_frame["STARTED"] - 1) obj.keyframe_insert(data_path="color", frame=product_frame["STARTED"] - 1)
obj.color = (1.0, 0.0, 0.0, 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"]) obj.keyframe_insert(data_path="color", frame=product_frame["COMPLETED"])
def animate_movement_from(self, obj, product_frame): def animate_movement_from(self, obj, product_frame):
obj.hide_viewport = False
obj.color = (1.0, 1.0, 1.0, 1) 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=self.start_frame)
obj.keyframe_insert(data_path="color", frame=product_frame["STARTED"] - 1) obj.keyframe_insert(data_path="color", frame=product_frame["STARTED"] - 1)
obj.color = (1.0, 0.5, 0.0, 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"]) obj.keyframe_insert(data_path="hide_viewport", frame=product_frame["COMPLETED"])
def animate_consumption(self, obj, product_frame): def animate_consumption(self, obj, product_frame):
obj.hide_viewport = False
obj.color = (1.0, 1.0, 1.0, 1) 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=self.start_frame)
obj.keyframe_insert(data_path="color", frame=product_frame["STARTED"] - 1) obj.keyframe_insert(data_path="color", frame=product_frame["STARTED"] - 1)
obj.color = (0.0, 1.0, 1.0, 1) obj.color = (0.0, 1.0, 1.0, 1)
@@ -1605,9 +1599,7 @@ class VisualiseWorkScheduleDateRange(bpy.types.Operator):
"type": task.PredefinedType, "type": task.PredefinedType,
"relationship": relationship, "relationship": relationship,
"STARTED": round(self.start_frame + (((start - self.start) / self.duration) * self.total_frames)), "STARTED": round(self.start_frame + (((start - self.start) / self.duration) * self.total_frames)),
"COMPLETED": round( "COMPLETED": round(self.start_frame + (((finish - self.start) / self.duration) * self.total_frames)),
self.start_frame + (((finish - self.start) / self.duration) * self.total_frames)
),
} }
) )
@@ -146,24 +146,36 @@ class Usecase:
finish = predecessor_data.get("early_finish") finish = predecessor_data.get("early_finish")
if finish is None: if finish is None:
return return
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"], data))
starts.append(self.offset_date(finish, edge["lag_time"], predecessor_data)) starts.append(self.offset_date(finish, edge["lag_time"], predecessor_data))
elif edge["type"] == "SS": elif edge["type"] == "SS":
start = predecessor_data.get("early_start") start = predecessor_data.get("early_start")
if start is None: if start is None:
return return
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"], data))
starts.append(self.offset_date(start, edge["lag_time"], predecessor_data)) starts.append(self.offset_date(start, edge["lag_time"], predecessor_data))
elif edge["type"] == "FF": elif edge["type"] == "FF":
finish = predecessor_data.get("early_finish") finish = predecessor_data.get("early_finish")
if finish is None: if finish is None:
return return
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"], data))
finishes.append(self.offset_date(finish, edge["lag_time"], predecessor_data)) finishes.append(self.offset_date(finish, edge["lag_time"], predecessor_data))
elif edge["type"] == "SF": elif edge["type"] == "SF":
start = predecessor_data.get("early_start") start = predecessor_data.get("early_start")
if start is None: if start is None:
return return
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"], data))
finishes.append(self.offset_date(start, edge["lag_time"], predecessor_data)) finishes.append(self.offset_date(start, edge["lag_time"], predecessor_data))
if starts and finishes: if starts and finishes:
@@ -205,6 +217,9 @@ class Usecase:
start = successor_data.get("late_start") start = successor_data.get("late_start")
if start is None: if start is None:
return return
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"], data))
finishes.append(self.offset_date(start, -edge["lag_time"], successor_data)) finishes.append(self.offset_date(start, -edge["lag_time"], successor_data))
free_floats.append( free_floats.append(
@@ -216,6 +231,9 @@ class Usecase:
start = successor_data.get("late_start") start = successor_data.get("late_start")
if start is None: if start is None:
return return
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"], data))
starts.append(self.offset_date(start, -edge["lag_time"], successor_data)) starts.append(self.offset_date(start, -edge["lag_time"], successor_data))
free_floats.append( free_floats.append(
@@ -227,6 +245,9 @@ class Usecase:
finish = successor_data.get("late_finish") finish = successor_data.get("late_finish")
if finish is None: if finish is None:
return return
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"], data))
finishes.append(self.offset_date(finish, -edge["lag_time"], successor_data)) finishes.append(self.offset_date(finish, -edge["lag_time"], successor_data))
free_floats.append( free_floats.append(
@@ -238,6 +259,9 @@ class Usecase:
finish = successor_data.get("late_finish") finish = successor_data.get("late_finish")
if finish is None: if finish is None:
return return
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"], data))
starts.append(self.offset_date(finish, -edge["lag_time"], successor_data)) starts.append(self.offset_date(finish, -edge["lag_time"], successor_data))
free_floats.append( free_floats.append(
@@ -278,6 +302,9 @@ class Usecase:
return True return True
def calculate_free_float(self, predecessor_date, successor_date, lag_time, predecessor_data, successor_data): def calculate_free_float(self, predecessor_date, successor_date, lag_time, predecessor_data, successor_data):
if not lag_time:
min_successor_date = successor_date
else:
min_successor_date = min( min_successor_date = min(
( (
self.offset_date(successor_date, -lag_time, predecessor_data), self.offset_date(successor_date, -lag_time, predecessor_data),