mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-21 14:23:53 +00:00
BBIM: Fixes for:
- Task Time attributes - Fix typo animation time calculation
This commit is contained in:
@@ -116,7 +116,7 @@ classes = (
|
|||||||
prop.Task,
|
prop.Task,
|
||||||
prop.TaskResource,
|
prop.TaskResource,
|
||||||
prop.TaskProduct,
|
prop.TaskProduct,
|
||||||
prop.BIMDuration,
|
prop.ISODuration,
|
||||||
prop.BIMWorkScheduleProperties,
|
prop.BIMWorkScheduleProperties,
|
||||||
prop.BIMTaskTreeProperties,
|
prop.BIMTaskTreeProperties,
|
||||||
prop.BIMTaskTypeColor,
|
prop.BIMTaskTypeColor,
|
||||||
|
|||||||
@@ -45,28 +45,31 @@ def canonicalise_time(time):
|
|||||||
return time.strftime("%d/%m/%y")
|
return time.strftime("%d/%m/%y")
|
||||||
|
|
||||||
|
|
||||||
def parse_duration_as_blender_props(dt):
|
def parse_duration_as_blender_props(dt, simplify=True):
|
||||||
seconds = dt.seconds
|
if simplify:
|
||||||
hours, seconds = divmod(seconds, 3600)
|
if isinstance(dt, str):
|
||||||
minutes, seconds = divmod(seconds, 60)
|
dt = ifcdateutils.ifc2datetime(dt)
|
||||||
days = dt.days
|
|
||||||
months = int(getattr(dt, "months", 0))
|
seconds = getattr(dt, "seconds", 0)
|
||||||
years = int(getattr(dt, "years", 0))
|
hours, seconds = divmod(seconds, 3600)
|
||||||
return {
|
minutes, seconds = divmod(seconds, 60)
|
||||||
"years": years,
|
days = getattr(dt, "days",0)
|
||||||
"months": months,
|
months = int(getattr(dt, "months", 0))
|
||||||
"days": days if days else 0,
|
years = int(getattr(dt, "years", 0))
|
||||||
"hours": hours if hours else 0,
|
return {
|
||||||
"minutes": minutes if minutes else 0,
|
"years": years,
|
||||||
"seconds": seconds if seconds else 0,
|
"months": months,
|
||||||
}
|
"days": days,
|
||||||
|
"hours": hours,
|
||||||
|
"minutes": minutes,
|
||||||
|
"seconds": seconds,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
def simplify_duration(durations_attributes, duration_type, prop_name):
|
def simplify_duration(durations_attributes, duration_type, prop_name):
|
||||||
for item in durations_attributes:
|
for item in durations_attributes:
|
||||||
if item.name == prop_name:
|
if item.name == prop_name:
|
||||||
duration_props = item
|
duration_props = item
|
||||||
print(duration_props, "duration_props")
|
|
||||||
if duration_props and not duration_type or duration_type == "ELAPSEDTIME":
|
if duration_props and not duration_type or duration_type == "ELAPSEDTIME":
|
||||||
duration_string = "P{}Y{}M{}DT{}H{}M{}S".format(
|
duration_string = "P{}Y{}M{}DT{}H{}M{}S".format(
|
||||||
duration_props.years if duration_props.years else 0,
|
duration_props.years if duration_props.years else 0,
|
||||||
|
|||||||
@@ -278,7 +278,7 @@ class Task(PropertyGroup):
|
|||||||
has_children: BoolProperty(name="Has Children")
|
has_children: BoolProperty(name="Has Children")
|
||||||
is_selected: BoolProperty(name="Is Selected")
|
is_selected: BoolProperty(name="Is Selected")
|
||||||
is_expanded: BoolProperty(name="Is Expanded")
|
is_expanded: BoolProperty(name="Is Expanded")
|
||||||
has_bar_visual: BoolProperty(name="Bar Visualization", default=False)
|
has_bar_visual: BoolProperty(name="Show Task Bar Animation", default=False)
|
||||||
level_index: IntProperty(name="Level Index")
|
level_index: IntProperty(name="Level Index")
|
||||||
duration: StringProperty(name="Duration", update=updateTaskDuration)
|
duration: StringProperty(name="Duration", update=updateTaskDuration)
|
||||||
start: StringProperty(name="Start", update=updateTaskTimeStart)
|
start: StringProperty(name="Start", update=updateTaskTimeStart)
|
||||||
@@ -317,18 +317,18 @@ class BIMWorkPlanProperties(PropertyGroup):
|
|||||||
work_schedules: EnumProperty(items=getWorkSchedules, name="Work Schedules")
|
work_schedules: EnumProperty(items=getWorkSchedules, name="Work Schedules")
|
||||||
|
|
||||||
|
|
||||||
class BIMDuration(PropertyGroup):
|
class ISODuration(PropertyGroup):
|
||||||
name: StringProperty(name="Attribute")
|
name: StringProperty(name="Name")
|
||||||
years: IntProperty(name="Years")
|
years: IntProperty(name="Years", default=0)
|
||||||
months: IntProperty(name="Months")
|
months: IntProperty(name="Months", default=0)
|
||||||
days: IntProperty(name="Days ")
|
days: IntProperty(name="Days", default=0)
|
||||||
hours: IntProperty(name="Hours")
|
hours: IntProperty(name="Hours", default=0)
|
||||||
minutes: IntProperty(name="Minutes")
|
minutes: IntProperty(name="Minutes", default=0)
|
||||||
seconds: IntProperty(name="Seconds")
|
seconds: IntProperty(name="Seconds", default=0)
|
||||||
|
|
||||||
|
|
||||||
class BIMWorkScheduleProperties(PropertyGroup):
|
class BIMWorkScheduleProperties(PropertyGroup):
|
||||||
durations_attributes: CollectionProperty(name="Durations Attributes", type=BIMDuration)
|
durations_attributes: CollectionProperty(name="Durations Attributes", type=ISODuration)
|
||||||
work_calendars: EnumProperty(items=getWorkCalendars, name="Work Calendars")
|
work_calendars: EnumProperty(items=getWorkCalendars, name="Work Calendars")
|
||||||
work_schedule_attributes: CollectionProperty(name="Work Schedule Attributes", type=Attribute)
|
work_schedule_attributes: CollectionProperty(name="Work Schedule Attributes", type=Attribute)
|
||||||
editing_type: StringProperty(name="Editing Type")
|
editing_type: StringProperty(name="Editing Type")
|
||||||
|
|||||||
@@ -344,7 +344,7 @@ class Sequence(blenderbim.core.tool.Sequence):
|
|||||||
@classmethod
|
@classmethod
|
||||||
def load_task_time_attributes(cls, task_time):
|
def load_task_time_attributes(cls, task_time):
|
||||||
def callback(name, prop, data):
|
def callback(name, prop, data):
|
||||||
if prop.data_type == "string":
|
if prop and prop.data_type == "string":
|
||||||
duration_props = bpy.context.scene.BIMWorkScheduleProperties.durations_attributes.add()
|
duration_props = bpy.context.scene.BIMWorkScheduleProperties.durations_attributes.add()
|
||||||
duration_props.name = name
|
duration_props.name = name
|
||||||
if prop.is_null:
|
if prop.is_null:
|
||||||
@@ -353,8 +353,7 @@ class Sequence(blenderbim.core.tool.Sequence):
|
|||||||
setattr(duration_props, key, 0)
|
setattr(duration_props, key, 0)
|
||||||
return True
|
return True
|
||||||
if name in ["ScheduleDuration", "ActualDuration", "FreeFloat", "TotalFloat"] and data[name]:
|
if name in ["ScheduleDuration", "ActualDuration", "FreeFloat", "TotalFloat"] and data[name]:
|
||||||
time_object = ifcopenshell.util.date.ifc2datetime(data[name])
|
for key, value in helper.parse_duration_as_blender_props(data[name]).items():
|
||||||
for key, value in helper.parse_duration_as_blender_props(time_object).items():
|
|
||||||
duration_props[key] = value
|
duration_props[key] = value
|
||||||
return True
|
return True
|
||||||
if isinstance(data[name], datetime):
|
if isinstance(data[name], datetime):
|
||||||
@@ -396,7 +395,7 @@ class Sequence(blenderbim.core.tool.Sequence):
|
|||||||
value = 0
|
value = 0
|
||||||
return True
|
return True
|
||||||
else:
|
else:
|
||||||
duration_type = getattr(attributes, "DurationType", None)
|
duration_type = attributes["DurationType"] if "DurationType" in attributes else None
|
||||||
time_split_iso_duration = helper.simplify_duration(
|
time_split_iso_duration = helper.simplify_duration(
|
||||||
props.durations_attributes, duration_type, prop.name
|
props.durations_attributes, duration_type, prop.name
|
||||||
)
|
)
|
||||||
@@ -1030,7 +1029,7 @@ class Sequence(blenderbim.core.tool.Sequence):
|
|||||||
|
|
||||||
def calculate_using_multiplier(start, finish, fps, multiplier):
|
def calculate_using_multiplier(start, finish, fps, multiplier):
|
||||||
animation_time = (finish - start) / multiplier
|
animation_time = (finish - start) / multiplier
|
||||||
return animation_time.seconds_left() * fps
|
return animation_time.total_seconds() * fps
|
||||||
|
|
||||||
def calculate_using_duration(start, finish, fps, animation_duration, real_duration):
|
def calculate_using_duration(start, finish, fps, animation_duration, real_duration):
|
||||||
return calculate_using_multiplier(start, finish, fps, real_duration / animation_duration)
|
return calculate_using_multiplier(start, finish, fps, real_duration / animation_duration)
|
||||||
@@ -1039,6 +1038,8 @@ class Sequence(blenderbim.core.tool.Sequence):
|
|||||||
return ((finish - start) / real_duration) * animation_frames
|
return ((finish - start) / real_duration) * animation_frames
|
||||||
|
|
||||||
props = bpy.context.scene.BIMWorkScheduleProperties
|
props = bpy.context.scene.BIMWorkScheduleProperties
|
||||||
|
if not (props.visualisation_start and props.visualisation_finish):
|
||||||
|
return
|
||||||
start = parser.parse(props.visualisation_start, dayfirst=True, fuzzy=True)
|
start = parser.parse(props.visualisation_start, dayfirst=True, fuzzy=True)
|
||||||
finish = parser.parse(props.visualisation_finish, dayfirst=True, fuzzy=True)
|
finish = parser.parse(props.visualisation_finish, dayfirst=True, fuzzy=True)
|
||||||
duration = finish - start
|
duration = finish - start
|
||||||
|
|||||||
Reference in New Issue
Block a user