mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-21 14:23:53 +00:00
implement DatePicker, visualisation time demo (#1488)
This commit is contained in:
@@ -66,6 +66,9 @@ classes = (
|
|||||||
operator.SelectTaskRelatedProducts,
|
operator.SelectTaskRelatedProducts,
|
||||||
operator.VisualiseWorkScheduleDate,
|
operator.VisualiseWorkScheduleDate,
|
||||||
operator.VisualiseWorkScheduleDateRange,
|
operator.VisualiseWorkScheduleDateRange,
|
||||||
|
operator.BlenderBIM_DatePicker,
|
||||||
|
operator.BlenderBIM_DatePickerSetDate,
|
||||||
|
operator.BlenderBIM_RedrawDatePicker,
|
||||||
prop.WorkPlan,
|
prop.WorkPlan,
|
||||||
prop.BIMWorkPlanProperties,
|
prop.BIMWorkPlanProperties,
|
||||||
prop.Task,
|
prop.Task,
|
||||||
@@ -74,6 +77,7 @@ classes = (
|
|||||||
prop.WorkCalendar,
|
prop.WorkCalendar,
|
||||||
prop.RecurrenceComponent,
|
prop.RecurrenceComponent,
|
||||||
prop.BIMWorkCalendarProperties,
|
prop.BIMWorkCalendarProperties,
|
||||||
|
prop.DatePickerProperties,
|
||||||
ui.BIM_PT_work_plans,
|
ui.BIM_PT_work_plans,
|
||||||
ui.BIM_PT_work_schedules,
|
ui.BIM_PT_work_schedules,
|
||||||
ui.BIM_PT_work_calendars,
|
ui.BIM_PT_work_calendars,
|
||||||
@@ -91,6 +95,7 @@ def register():
|
|||||||
bpy.types.Scene.BIMWorkScheduleProperties = bpy.props.PointerProperty(type=prop.BIMWorkScheduleProperties)
|
bpy.types.Scene.BIMWorkScheduleProperties = bpy.props.PointerProperty(type=prop.BIMWorkScheduleProperties)
|
||||||
bpy.types.Scene.BIMTaskTreeProperties = bpy.props.PointerProperty(type=prop.BIMTaskTreeProperties)
|
bpy.types.Scene.BIMTaskTreeProperties = bpy.props.PointerProperty(type=prop.BIMTaskTreeProperties)
|
||||||
bpy.types.Scene.BIMWorkCalendarProperties = bpy.props.PointerProperty(type=prop.BIMWorkCalendarProperties)
|
bpy.types.Scene.BIMWorkCalendarProperties = bpy.props.PointerProperty(type=prop.BIMWorkCalendarProperties)
|
||||||
|
bpy.types.Scene.DatePickerProperties = bpy.props.PointerProperty(type=prop.DatePickerProperties)
|
||||||
bpy.types.TOPBAR_MT_file_import.append(menu_func_import)
|
bpy.types.TOPBAR_MT_file_import.append(menu_func_import)
|
||||||
|
|
||||||
|
|
||||||
@@ -99,4 +104,5 @@ def unregister():
|
|||||||
del bpy.types.Scene.BIMWorkScheduleProperties
|
del bpy.types.Scene.BIMWorkScheduleProperties
|
||||||
del bpy.types.Scene.BIMTaskTreeProperties
|
del bpy.types.Scene.BIMTaskTreeProperties
|
||||||
del bpy.types.Scene.BIMWorkCalendarProperties
|
del bpy.types.Scene.BIMWorkCalendarProperties
|
||||||
|
del bpy.types.Scene.DatePickerProperties
|
||||||
bpy.types.TOPBAR_MT_file_import.remove(menu_func_import)
|
bpy.types.TOPBAR_MT_file_import.remove(menu_func_import)
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import bpy
|
||||||
import math
|
import math
|
||||||
import isodate
|
import isodate
|
||||||
import datetime
|
import datetime
|
||||||
@@ -5,8 +6,6 @@ from dateutil import parser
|
|||||||
from ifcopenshell.api.sequence.data import Data
|
from ifcopenshell.api.sequence.data import Data
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def derive_date(ifc_definition_id, attribute_name, date=None, is_earliest=False, is_latest=False):
|
def derive_date(ifc_definition_id, attribute_name, date=None, is_earliest=False, is_latest=False):
|
||||||
task = Data.tasks[ifc_definition_id]
|
task = Data.tasks[ifc_definition_id]
|
||||||
if task["TaskTime"]:
|
if task["TaskTime"]:
|
||||||
@@ -56,3 +55,23 @@ def parse_duration(value):
|
|||||||
return isodate.parse_duration(value)
|
return isodate.parse_duration(value)
|
||||||
except:
|
except:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def canonicalise_time(time):
|
||||||
|
if not time:
|
||||||
|
return "-"
|
||||||
|
return time.strftime("%d/%m/%y")
|
||||||
|
|
||||||
|
|
||||||
|
def get_scene_prop(prop_path):
|
||||||
|
prop = bpy.context.scene.get(prop_path.split(".")[0])
|
||||||
|
for part in prop_path.split(".")[1:]:
|
||||||
|
if part:
|
||||||
|
prop = prop.get(part)
|
||||||
|
return prop
|
||||||
|
|
||||||
|
|
||||||
|
def set_scene_prop(prop_path, value):
|
||||||
|
parent = get_scene_prop(prop_path[: prop_path.rfind(".")])
|
||||||
|
prop = prop_path.split(".")[-1]
|
||||||
|
parent[prop] = value
|
||||||
@@ -3,6 +3,7 @@ import os
|
|||||||
import bpy
|
import bpy
|
||||||
import json
|
import json
|
||||||
import time
|
import time
|
||||||
|
import calendar
|
||||||
import isodate
|
import isodate
|
||||||
import pystache
|
import pystache
|
||||||
import webbrowser
|
import webbrowser
|
||||||
@@ -13,7 +14,7 @@ import blenderbim.bim.helper
|
|||||||
import blenderbim.bim.module.sequence.helper as helper
|
import blenderbim.bim.module.sequence.helper as helper
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from datetime import timedelta
|
from datetime import timedelta
|
||||||
from dateutil import parser
|
from dateutil import parser, relativedelta
|
||||||
from blenderbim.bim.ifc import IfcStore
|
from blenderbim.bim.ifc import IfcStore
|
||||||
from bpy_extras.io_utils import ImportHelper
|
from bpy_extras.io_utils import ImportHelper
|
||||||
from ifcopenshell.api.sequence.data import Data
|
from ifcopenshell.api.sequence.data import Data
|
||||||
@@ -1424,3 +1425,89 @@ class VisualiseWorkScheduleDateRange(bpy.types.Operator):
|
|||||||
"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(self.start_frame + (((finish - self.start) / self.duration) * self.total_frames)),
|
"COMPLETED": round(self.start_frame + (((finish - self.start) / self.duration) * self.total_frames)),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class BlenderBIM_DatePicker(bpy.types.Operator):
|
||||||
|
bl_label = "Date Picker"
|
||||||
|
bl_idname = "bim.datepicker"
|
||||||
|
display_date: bpy.props.StringProperty(name="Display Date")
|
||||||
|
selected_date: bpy.props.StringProperty(name="Selected Date")
|
||||||
|
target_prop: bpy.props.StringProperty(name="Target date prop to set")
|
||||||
|
|
||||||
|
def execute(self, context):
|
||||||
|
helper.set_scene_prop(self.target_prop, self.selected_date)
|
||||||
|
return {"FINISHED"}
|
||||||
|
|
||||||
|
def draw(self, context):
|
||||||
|
self.selected_date = helper.get_scene_prop("DatePickerProperties.selected_date") or helper.canonicalise_time(datetime.now())
|
||||||
|
current_date = parser.parse(context.scene.DatePickerProperties.display_date, dayfirst=True, fuzzy=True)
|
||||||
|
current_month = (current_date.year, current_date.month)
|
||||||
|
lines = calendar.monthcalendar(*current_month)
|
||||||
|
month_title, week_titles = calendar.month(*current_month).splitlines()[:2]
|
||||||
|
|
||||||
|
layout = self.layout
|
||||||
|
row = layout.row()
|
||||||
|
row.prop(self, "selected_date")
|
||||||
|
|
||||||
|
split = layout.split()
|
||||||
|
col = split.row()
|
||||||
|
op = col.operator("bim.redraw_datepicker", icon="TRIA_LEFT", text="")
|
||||||
|
op.action = "previous"
|
||||||
|
col = split.row()
|
||||||
|
col.label(text=month_title.strip())
|
||||||
|
col = split.row()
|
||||||
|
col.alignment = "RIGHT"
|
||||||
|
op = col.operator("bim.redraw_datepicker", icon="TRIA_RIGHT", text="")
|
||||||
|
op.action = "next"
|
||||||
|
|
||||||
|
row = layout.row(align=True)
|
||||||
|
for title in week_titles.split():
|
||||||
|
col = row.column(align=True)
|
||||||
|
col.alignment = "CENTER"
|
||||||
|
col.label(text=title.strip())
|
||||||
|
|
||||||
|
for line in lines:
|
||||||
|
row = layout.row(align=True)
|
||||||
|
for i in line:
|
||||||
|
col = row.column(align=True)
|
||||||
|
if i == 0:
|
||||||
|
col.label(text=" ")
|
||||||
|
else:
|
||||||
|
op = col.operator("bim.datepicker_setdate", text="{:2d}".format(i))
|
||||||
|
selected_date = "{}/{}/{}".format(i, current_date.month, current_date.year)
|
||||||
|
selected_date = parser.parse(selected_date, dayfirst=True, fuzzy=True)
|
||||||
|
op.selected_date = helper.canonicalise_time(selected_date)
|
||||||
|
|
||||||
|
def invoke(self, context, event):
|
||||||
|
self.display_date = helper.get_scene_prop(self.target_prop) or helper.canonicalise_time(datetime.now())
|
||||||
|
context.scene.DatePickerProperties.display_date = self.display_date
|
||||||
|
context.scene.DatePickerProperties.selected_date = self.display_date
|
||||||
|
return context.window_manager.invoke_props_dialog(self)
|
||||||
|
|
||||||
|
|
||||||
|
class BlenderBIM_DatePickerSetDate(bpy.types.Operator):
|
||||||
|
bl_label = "set date"
|
||||||
|
bl_idname = "bim.datepicker_setdate"
|
||||||
|
selected_date: bpy.props.StringProperty()
|
||||||
|
|
||||||
|
def invoke(self, context, event):
|
||||||
|
context.scene.DatePickerProperties.selected_date = self.selected_date
|
||||||
|
return {"FINISHED"}
|
||||||
|
|
||||||
|
|
||||||
|
class BlenderBIM_RedrawDatePicker(bpy.types.Operator):
|
||||||
|
bl_label = "redraw datepicker window"
|
||||||
|
bl_idname = "bim.redraw_datepicker"
|
||||||
|
action: bpy.props.StringProperty()
|
||||||
|
|
||||||
|
def invoke(self, context, event):
|
||||||
|
current_date = parser.parse(context.scene.DatePickerProperties.display_date, dayfirst=True, fuzzy=True)
|
||||||
|
|
||||||
|
if self.action == "previous":
|
||||||
|
date_to_set = current_date - relativedelta.relativedelta(months=1)
|
||||||
|
elif self.action == "next":
|
||||||
|
date_to_set = current_date + relativedelta.relativedelta(months=1)
|
||||||
|
|
||||||
|
context.scene.DatePickerProperties.display_date = helper.canonicalise_time(date_to_set)
|
||||||
|
|
||||||
|
return {"FINISHED"}
|
||||||
|
|||||||
@@ -121,7 +121,7 @@ def updateTaskduration(self, context):
|
|||||||
ifcopenshell.api.run(
|
ifcopenshell.api.run(
|
||||||
"sequence.edit_task_time",
|
"sequence.edit_task_time",
|
||||||
self.file,
|
self.file,
|
||||||
**{"task_time":task_time, "attributes": {"ScheduleDuration": self.duration}},
|
**{"task_time": task_time, "attributes": {"ScheduleDuration": self.duration}},
|
||||||
)
|
)
|
||||||
Data.load(IfcStore.get_file())
|
Data.load(IfcStore.get_file())
|
||||||
if props.active_task_id == self.ifc_definition_id:
|
if props.active_task_id == self.ifc_definition_id:
|
||||||
@@ -283,3 +283,8 @@ class BIMWorkCalendarProperties(PropertyGroup):
|
|||||||
)
|
)
|
||||||
start_time: StringProperty(name="Start Time")
|
start_time: StringProperty(name="Start Time")
|
||||||
end_time: StringProperty(name="End Time")
|
end_time: StringProperty(name="End Time")
|
||||||
|
|
||||||
|
|
||||||
|
class DatePickerProperties(PropertyGroup):
|
||||||
|
display_date: StringProperty()
|
||||||
|
selected_date: StringProperty()
|
||||||
|
|||||||
@@ -2,6 +2,8 @@ import isodate
|
|||||||
from bpy.types import Panel, UIList
|
from bpy.types import Panel, UIList
|
||||||
from blenderbim.bim.ifc import IfcStore
|
from blenderbim.bim.ifc import IfcStore
|
||||||
from ifcopenshell.api.sequence.data import Data
|
from ifcopenshell.api.sequence.data import Data
|
||||||
|
import blenderbim.bim.module.sequence.helper as helper
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
|
|
||||||
class BIM_PT_work_plans(Panel):
|
class BIM_PT_work_plans(Panel):
|
||||||
@@ -133,8 +135,12 @@ class BIM_PT_work_schedules(Panel):
|
|||||||
|
|
||||||
def draw_visualisation_ui(self):
|
def draw_visualisation_ui(self):
|
||||||
row = self.layout.row(align=True)
|
row = self.layout.row(align=True)
|
||||||
row.prop(self.props, "visualisation_start", text="", icon="REW")
|
target_prop = "BIMWorkScheduleProperties.visualisation_start"
|
||||||
row.prop(self.props, "visualisation_finish", text="", icon="FF")
|
op = row.operator("bim.datepicker", text=helper.get_scene_prop(target_prop), icon="REW")
|
||||||
|
op.target_prop = target_prop
|
||||||
|
target_prop = "BIMWorkScheduleProperties.visualisation_finish"
|
||||||
|
op = row.operator("bim.datepicker", text=helper.get_scene_prop(target_prop), icon="FF")
|
||||||
|
op.target_prop = target_prop
|
||||||
op = row.operator("bim.visualise_work_schedule_date", text="", icon="RESTRICT_RENDER_OFF")
|
op = row.operator("bim.visualise_work_schedule_date", text="", icon="RESTRICT_RENDER_OFF")
|
||||||
op.work_schedule = self.props.active_work_schedule_id
|
op.work_schedule = self.props.active_work_schedule_id
|
||||||
op = row.operator("bim.visualise_work_schedule_date_range", text="", icon="OUTLINER_OB_CAMERA")
|
op = row.operator("bim.visualise_work_schedule_date_range", text="", icon="OUTLINER_OB_CAMERA")
|
||||||
|
|||||||
Reference in New Issue
Block a user