Basic header for work schedule panel header #5928

Example - https://i.imgur.com/9thZQCX.png
This commit is contained in:
Andrej730
2025-01-16 18:17:12 +05:00
parent 9573628bf6
commit b28a3b6e32
+73 -26
View File
@@ -16,7 +16,10 @@
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see <http://www.gnu.org/licenses/>. # along with Bonsai. If not, see <http://www.gnu.org/licenses/>.
import bpy
import ifcopenshell
import isodate import isodate
import bonsai.tool as tool
import bonsai.bim.helper import bonsai.bim.helper
from bpy.types import Panel, UIList from bpy.types import Panel, UIList
from bonsai.bim.ifc import IfcStore from bonsai.bim.ifc import IfcStore
@@ -28,7 +31,7 @@ from bonsai.bim.module.sequence.data import (
TaskICOMData, TaskICOMData,
AnimationColorSchemeData, AnimationColorSchemeData,
) )
from typing import Any from typing import Any, Optional
class BIM_PT_status(Panel): class BIM_PT_status(Panel):
@@ -320,6 +323,7 @@ class BIM_PT_work_schedules(Panel):
row.operator("bim.contract_all_tasks", text="Contract All") row.operator("bim.contract_all_tasks", text="Contract All")
row = self.layout.row(align=True) row = self.layout.row(align=True)
self.draw_task_operators() self.draw_task_operators()
BIM_UL_tasks.draw_header(self.layout)
self.layout.template_list( self.layout.template_list(
"BIM_UL_tasks", "BIM_UL_tasks",
"", "",
@@ -814,10 +818,23 @@ class BIM_UL_product_output_tasks(UIList):
class BIM_UL_tasks(UIList): class BIM_UL_tasks(UIList):
@classmethod
def draw_header(cls, layout: bpy.types.UILayout):
props = bpy.context.scene.BIMWorkScheduleProperties
row = layout.row(align=True)
split1 = row.split(factor=0.1)
split1.label(text="ID", icon="BLANK1")
split2 = split1.split(factor=0.9 - min(0.5, 0.15 * len(props.columns)))
split2.label(text="Name")
cls.draw_custom_columns(props, split2, header=True)
def draw_item(self, context, layout, data, item, icon, active_data, active_propname): def draw_item(self, context, layout, data, item, icon, active_data, active_propname):
if item: if item:
self.props = context.scene.BIMWorkScheduleProperties self.props = context.scene.BIMWorkScheduleProperties
task = IfcStore.get_file().by_id(item.ifc_definition_id) ifc_file = tool.Ifc.get()
# TODO: cache instead of accessing IFC directly.
task = ifc_file.by_id(item.ifc_definition_id)
row = layout.row(align=True) row = layout.row(align=True)
self.draw_hierarchy(row, item) self.draw_hierarchy(row, item)
@@ -827,7 +844,7 @@ class BIM_UL_tasks(UIList):
split2 = split1.split(factor=0.9 - min(0.5, 0.15 * len(self.props.columns))) split2 = split1.split(factor=0.9 - min(0.5, 0.15 * len(self.props.columns)))
split2.prop(item, "name", emboss=False, text="") split2.prop(item, "name", emboss=False, text="")
self.draw_custom_columns(split2, item, task) BIM_UL_tasks.draw_custom_columns(self.props, split2, item, task)
if self.props.active_task_id and self.props.editing_task_type == "ATTRIBUTES": if self.props.active_task_id and self.props.editing_task_type == "ATTRIBUTES":
row.prop( row.prop(
@@ -860,7 +877,7 @@ class BIM_UL_tasks(UIList):
op = row.operator("bim.assign_successor", text="", icon="TRACKING_FORWARDS", emboss=False) op = row.operator("bim.assign_successor", text="", icon="TRACKING_FORWARDS", emboss=False)
op.task = item.ifc_definition_id op.task = item.ifc_definition_id
def draw_order_operator(self, row, ifc_definition_id): def draw_order_operator(self, row: bpy.types.UILayout, ifc_definition_id: int) -> None:
task = SequenceData.data["tasks"][ifc_definition_id] task = SequenceData.data["tasks"][ifc_definition_id]
if task["NestingIndex"] is not None: if task["NestingIndex"] is not None:
if task["NestingIndex"] == 0: if task["NestingIndex"] == 0:
@@ -872,7 +889,7 @@ class BIM_UL_tasks(UIList):
op.task = ifc_definition_id op.task = ifc_definition_id
op.new_index = task["NestingIndex"] - 1 op.new_index = task["NestingIndex"] - 1
def draw_hierarchy(self, row, item): def draw_hierarchy(self, row: bpy.types.UILayout, item: bpy.types.PropertyGroup) -> None:
for i in range(0, item.level_index): for i in range(0, item.level_index):
row.label(text="", icon="BLANK1") row.label(text="", icon="BLANK1")
if item.has_children: if item.has_children:
@@ -887,37 +904,67 @@ class BIM_UL_tasks(UIList):
else: else:
row.label(text="", icon="DOT") row.label(text="", icon="DOT")
def draw_custom_columns(self, row, item, task): @classmethod
for column in self.props.columns: def draw_custom_columns(
cls,
props: bpy.types.PropertyGroup,
row: bpy.types.UILayout,
item: Optional[bpy.types.PropertyGroup] = None,
task: Optional[ifcopenshell.entity_instance] = None,
*,
header: bool = False,
) -> None:
if not header:
assert item and task
for column in props.columns:
if column.name == "IfcTaskTime.ScheduleStart": if column.name == "IfcTaskTime.ScheduleStart":
if item.derived_start: if header:
row.label(text=item.derived_start + "*") row.label(text="Start")
else: else:
row.prop(item, "start", emboss=False, text="") if item.derived_start:
row.label(text=item.derived_start + "*")
else:
row.prop(item, "start", emboss=False, text="")
elif column.name == "IfcTaskTime.ScheduleFinish": elif column.name == "IfcTaskTime.ScheduleFinish":
if item.derived_finish: if header:
row.label(text=item.derived_finish + "*") row.label(text="Finish")
else: else:
row.prop(item, "finish", emboss=False, text="") if item.derived_finish:
row.label(text=item.derived_finish + "*")
else:
row.prop(item, "finish", emboss=False, text="")
elif column.name == "IfcTaskTime.ScheduleDuration": elif column.name == "IfcTaskTime.ScheduleDuration":
if item.derived_duration: if header:
row.label(text=item.derived_duration + "*") row.label(text="Duration")
else: else:
row.prop(item, "duration", emboss=False, text="") if item.derived_duration:
row.label(text=item.derived_duration + "*")
else:
row.prop(item, "duration", emboss=False, text="")
elif column.name == "Controls.Calendar": elif column.name == "Controls.Calendar":
if item.derived_calendar: if header:
row.label(text=item.derived_calendar + "*") row.label(text="Calendar")
else: else:
row.label(text=item.calendar or "-") if item.derived_calendar:
row.label(text=item.derived_calendar + "*")
else:
row.label(text=item.calendar or "-")
else: else:
ifc_class, name = column.name.split(".") ifc_class, name = column.name.split(".")
if ifc_class == "IfcTask": if header:
value = getattr(task, name) row.label(text=name)
elif ifc_class == "IfcTaskTime": else:
value = getattr(task.TaskTime, name) if task.TaskTime else None if ifc_class == "IfcTask":
if value is None: value = getattr(task, name)
value = "-" elif ifc_class == "IfcTaskTime":
row.label(text=str(value)) value = getattr(task.TaskTime, name) if task.TaskTime else None
else:
assert False, f"Unexpected ifc_class '{ifc_class}'."
if value is None:
value = "-"
else:
row.label(text=str(value))
class BIM_PT_work_calendars(Panel): class BIM_PT_work_calendars(Panel):