pp2ifc - preserve original ids

Now we're going to use bar ids instead their detalization ids (e.g. expanded task ids, task ids, milestone ids) because it is the way how it works in the software pp file originates from.
This commit is contained in:
Andrej730
2024-09-19 16:55:59 +05:00
parent ddca950f65
commit fb6d2b8de2
+18 -18
View File
@@ -12,6 +12,7 @@ import ifcopenshell.util.date
from .wpattern import AstaCalendarWorkPattern from .wpattern import AstaCalendarWorkPattern
from .common import ScheduleIfcGenerator, Calendar, WBSEntry, Activity from .common import ScheduleIfcGenerator, Calendar, WBSEntry, Activity
import time import time
from collections import defaultdict
from typing import Any from typing import Any
@@ -123,26 +124,24 @@ class PP2Ifc:
expanded_tasks = {t["BAR"]: t for t in self.get_json("EXPANDED_TASK")} expanded_tasks = {t["BAR"]: t for t in self.get_json("EXPANDED_TASK")}
tasks = {t["BAR"]: t for t in self.get_json("TASK")} tasks = {t["BAR"]: t for t in self.get_json("TASK")}
milestones = {m["BAR"]: m for m in self.get_json("MILESTONE")} milestones = {m["BAR"]: m for m in self.get_json("MILESTONE")}
expanded_tasks_to_bars: dict[int, int] = {v["ID"]: k for k, v in expanded_tasks.items()}
schedule_task = None wbs_activities: defaultdict[int, list[int]] = defaultdict(list)
bar_tasks = {}
wbs_activities: dict[int, list[int]] = {}
for bar in bars: for bar in bars:
extra_type = None extra_type = None
extra_data = None extra_data = None
bar_id = None bar_id: int = bar["ID"]
if bar["ID"] in expanded_tasks: if bar_id in expanded_tasks:
extra_type = "EXPANDED_TASK" extra_type = "EXPANDED_TASK"
extra_data = expanded_tasks[bar["ID"]] extra_data = expanded_tasks[bar_id]
elif bar["ID"] in tasks: elif bar_id in tasks:
extra_type = "TASK" extra_type = "TASK"
extra_data = tasks[bar["ID"]] extra_data = tasks[bar_id]
elif bar["ID"] in milestones: elif bar_id in milestones:
extra_type = "MILESTONE" extra_type = "MILESTONE"
extra_data = milestones[bar["ID"]] extra_data = milestones[bar_id]
else: else:
# Not sure where this might be the case # Not sure where this might be the case
continue continue
@@ -150,13 +149,13 @@ class PP2Ifc:
name = bar["NAME"] name = bar["NAME"]
if extra_data["NAME"]: if extra_data["NAME"]:
name += f" - {extra_data['NAME']}" name += f" - {extra_data['NAME']}"
bar_tasks[extra_data["ID"]] = {"bar": bar, "extra_type": extra_type, "extra_data": extra_data}
parent_task_id = expanded_tasks_to_bars[bar["EXPANDED_TASK"]] if bar["EXPANDED_TASK"] > 0 else None
if extra_type == "EXPANDED_TASK": if extra_type == "EXPANDED_TASK":
self.wbs[extra_data["ID"]] = { self.wbs[bar_id] = {
"Name": name, "Name": name,
"Code": extra_data["ID"], "Code": bar_id,
"ParentObjectId": bar["EXPANDED_TASK"] if bar["EXPANDED_TASK"] > 0 else None, "ParentObjectId": parent_task_id,
"ifc": None, "ifc": None,
"rel": None, "rel": None,
"activities": [], "activities": [],
@@ -173,9 +172,9 @@ class PP2Ifc:
else: else:
activity_duration = 0.0 activity_duration = 0.0
self.activities[extra_data["ID"]] = Activity( self.activities[bar_id] = Activity(
Name=name, Name=name,
Identification=bar["ID"], Identification=bar_id,
StartDate=datetime.datetime.fromisoformat(extra_data["LINKABLE_START"]), StartDate=datetime.datetime.fromisoformat(extra_data["LINKABLE_START"]),
FinishDate=datetime.datetime.fromisoformat(extra_data["LINKABLE_FINISH"]), FinishDate=datetime.datetime.fromisoformat(extra_data["LINKABLE_FINISH"]),
PlannedDuration=activity_duration, PlannedDuration=activity_duration,
@@ -183,7 +182,8 @@ class PP2Ifc:
CalendarObjectId=extra_data["CALENDAR"], CalendarObjectId=extra_data["CALENDAR"],
ifc=None, ifc=None,
) )
wbs_activities.setdefault(bar["EXPANDED_TASK"], []).append(extra_data["ID"]) # No idea if it's possible that activity won't have a parent task.
wbs_activities[parent_task_id].append(bar_id)
for wbs, activities in wbs_activities.items(): for wbs, activities in wbs_activities.items():
self.wbs[wbs]["activities"] = activities self.wbs[wbs]["activities"] = activities