mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-08-10 01:41:57 +00:00
add pset view to groups
This commit is contained in:
@@ -245,7 +245,9 @@ def get_obj_ifc_definition_id(context, obj, obj_type):
|
||||
].ifc_definition_id
|
||||
elif obj_type == "WorkSchedule":
|
||||
return context.scene.BIMWorkScheduleProperties.active_work_schedule_id
|
||||
|
||||
elif obj_type == "Group":
|
||||
prop = context.scene.BIMGroupProperties
|
||||
return prop.groups[prop.active_group_index].ifc_definition_id
|
||||
|
||||
# hack to close popup
|
||||
# https://blender.stackexchange.com/a/202576/130742
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
|
||||
import bpy
|
||||
from blenderbim.bim.prop import StrProperty, Attribute
|
||||
from blenderbim.bim.helper import import_attributes
|
||||
from blenderbim.bim.module.pset.data import refresh as refresh_pset
|
||||
from bpy.types import PropertyGroup
|
||||
import json
|
||||
from bpy.props import (
|
||||
@@ -33,6 +33,10 @@ from bpy.props import (
|
||||
)
|
||||
|
||||
|
||||
def update_active_group_index(self, context):
|
||||
refresh_pset()
|
||||
|
||||
|
||||
class ExpandedGroups(StrProperty):
|
||||
json_string: StringProperty(name="JSON String", default="[]")
|
||||
|
||||
@@ -50,5 +54,5 @@ class BIMGroupProperties(PropertyGroup):
|
||||
group_attributes: CollectionProperty(name="Group Attributes", type=Attribute)
|
||||
is_editing: BoolProperty(name="Is Editing", default=False)
|
||||
groups: CollectionProperty(name="Groups", type=Group)
|
||||
active_group_index: IntProperty(name="Active Group Index")
|
||||
active_group_index: IntProperty(name="Active Group Index", update=update_active_group_index)
|
||||
active_group_id: IntProperty(name="Active Group Id")
|
||||
|
||||
@@ -44,6 +44,7 @@ classes = (
|
||||
prop.MaterialSetItemPsetProperties,
|
||||
prop.TaskPsetProperties,
|
||||
prop.ResourcePsetProperties,
|
||||
prop.GroupPsetProperties,
|
||||
prop.ProfilePsetProperties,
|
||||
prop.WorkSchedulePsetProperties,
|
||||
prop.RenameProperties,
|
||||
@@ -57,6 +58,8 @@ classes = (
|
||||
ui.BIM_PT_task_qtos,
|
||||
ui.BIM_PT_resource_qtos,
|
||||
ui.BIM_PT_resource_psets,
|
||||
ui.BIM_PT_group_psets,
|
||||
ui.BIM_PT_group_qtos,
|
||||
ui.BIM_PT_profile_psets,
|
||||
ui.BIM_PT_work_schedule_psets,
|
||||
ui.BIM_PT_bulk_property_editor,
|
||||
@@ -73,6 +76,7 @@ def register():
|
||||
bpy.types.Material.PsetProperties = bpy.props.PointerProperty(type=prop.MaterialPsetProperties)
|
||||
bpy.types.Scene.TaskPsetProperties = bpy.props.PointerProperty(type=prop.TaskPsetProperties)
|
||||
bpy.types.Scene.ResourcePsetProperties = bpy.props.PointerProperty(type=prop.ResourcePsetProperties)
|
||||
bpy.types.Scene.GroupPsetProperties = bpy.props.PointerProperty(type=prop.GroupPsetProperties)
|
||||
bpy.types.Scene.ProfilePsetProperties = bpy.props.PointerProperty(type=prop.ProfilePsetProperties)
|
||||
bpy.types.Scene.WorkSchedulePsetProperties = bpy.props.PointerProperty(type=prop.WorkSchedulePsetProperties)
|
||||
bpy.types.Scene.RenameProperties = bpy.props.CollectionProperty(type=prop.RenameProperties)
|
||||
@@ -85,6 +89,7 @@ def unregister():
|
||||
del bpy.types.Material.PsetProperties
|
||||
del bpy.types.Scene.TaskPsetProperties
|
||||
del bpy.types.Scene.ResourcePsetProperties
|
||||
del bpy.types.Scene.GroupPsetProperties
|
||||
del bpy.types.Scene.ProfilePsetProperties
|
||||
del bpy.types.Scene.WorkSchedulePsetProperties
|
||||
del bpy.types.Scene.RenameProperties
|
||||
|
||||
@@ -36,6 +36,8 @@ def refresh():
|
||||
TaskQtosData.is_loaded = False
|
||||
ResourceQtosData.is_loaded = False
|
||||
ResourcePsetsData.is_loaded = False
|
||||
GroupQtosData.is_loaded = False
|
||||
GroupPsetData.is_loaded = False
|
||||
ProfilePsetsData.is_loaded = False
|
||||
WorkSchedulePsetsData.is_loaded = False
|
||||
AddEditCustomPropertiesData.is_loaded = False
|
||||
@@ -205,6 +207,30 @@ class ResourcePsetsData(Data):
|
||||
cls.is_loaded = True
|
||||
|
||||
|
||||
class GroupQtosData(Data):
|
||||
data = {}
|
||||
is_loaded = False
|
||||
|
||||
@classmethod
|
||||
def load(cls):
|
||||
props = bpy.context.scene.BIMGroupProperties
|
||||
ifc_definition_id = props.groups[props.active_group_index].ifc_definition_id
|
||||
cls.data = {"qtos": cls.psetqtos(tool.Ifc.get_entity_by_id(ifc_definition_id), qtos_only=True)}
|
||||
cls.is_loaded = True
|
||||
|
||||
|
||||
class GroupPsetData(Data):
|
||||
data = {}
|
||||
is_loaded = False
|
||||
|
||||
@classmethod
|
||||
def load(cls):
|
||||
props = bpy.context.scene.BIMGroupProperties
|
||||
ifc_definition_id = props.groups[props.active_group_index].ifc_definition_id
|
||||
cls.data = {"psets": cls.psetqtos(tool.Ifc.get_entity_by_id(ifc_definition_id), psets_only=True)}
|
||||
cls.is_loaded = True
|
||||
|
||||
|
||||
class ProfilePsetsData(Data):
|
||||
data = {}
|
||||
is_loaded = False
|
||||
|
||||
@@ -58,7 +58,8 @@ def get_pset_props(context, obj, obj_type):
|
||||
return context.scene.ProfilePsetProperties
|
||||
elif obj_type == "WorkSchedule":
|
||||
return context.scene.WorkSchedulePsetProperties
|
||||
|
||||
elif obj_type == "Group":
|
||||
return context.scene.GroupPsetProperties
|
||||
|
||||
class TogglePsetExpansion(bpy.types.Operator, Operator):
|
||||
bl_idname = "bim.toggle_pset_expansion"
|
||||
@@ -196,6 +197,7 @@ class EnablePsetEditing(bpy.types.Operator):
|
||||
new.is_selected = enum in selected_enum_items
|
||||
|
||||
def load_from_pset_data(self, pset):
|
||||
props = []
|
||||
if pset.is_a("IfcElementQuantity"):
|
||||
props = pset.Quantities
|
||||
elif pset.is_a("IfcPropertySet"):
|
||||
|
||||
@@ -130,6 +130,23 @@ def get_resource_qto_names(self, context):
|
||||
return qtonames[ifc_class]
|
||||
|
||||
|
||||
def get_group_pset_names(self, context):
|
||||
global psetnames
|
||||
ifc_class = "IfcGroup"
|
||||
if ifc_class not in psetnames:
|
||||
psets = blenderbim.bim.schema.ifc.psetqto.get_applicable(ifc_class, pset_only=True)
|
||||
psetnames[ifc_class] = blender_formatted_enum_from_psets(psets)
|
||||
return psetnames[ifc_class]
|
||||
|
||||
|
||||
def get_group_qto_names(self, context):
|
||||
global qtonames
|
||||
ifc_class = "IfcGroup"
|
||||
if ifc_class not in qtonames:
|
||||
psets = blenderbim.bim.schema.ifc.psetqto.get_applicable(ifc_class, qto_only=True)
|
||||
qtonames[ifc_class] = blender_formatted_enum_from_psets(psets)
|
||||
return qtonames[ifc_class]
|
||||
|
||||
def get_profile_pset_names(self, context):
|
||||
global psetnames
|
||||
pprops = context.scene.BIMProfileProperties
|
||||
@@ -229,6 +246,14 @@ class ResourcePsetProperties(PropertyGroup):
|
||||
qto_name: EnumProperty(items=get_resource_qto_names, name="Qto Name")
|
||||
|
||||
|
||||
class GroupPsetProperties(PropertyGroup):
|
||||
active_pset_id: IntProperty(name="Active Pset ID")
|
||||
active_pset_name: StringProperty(name="Pset Name")
|
||||
active_pset_type: StringProperty(name="Active Pset Type")
|
||||
properties: CollectionProperty(name="Properties", type=IfcProperty)
|
||||
pset_name: EnumProperty(items=get_group_pset_names, name="Pset Name")
|
||||
qto_name: EnumProperty(items=get_group_qto_names, name="Qto Name")
|
||||
|
||||
class ProfilePsetProperties(PropertyGroup):
|
||||
active_pset_id: IntProperty(name="Active Pset ID")
|
||||
active_pset_name: StringProperty(name="Pset Name")
|
||||
|
||||
@@ -29,8 +29,11 @@ from blenderbim.bim.module.pset.data import (
|
||||
TaskQtosData,
|
||||
ResourceQtosData,
|
||||
ResourcePsetsData,
|
||||
GroupQtosData,
|
||||
GroupPsetData,
|
||||
ProfilePsetsData,
|
||||
WorkSchedulePsetsData,
|
||||
|
||||
)
|
||||
|
||||
|
||||
@@ -470,6 +473,76 @@ class BIM_PT_resource_psets(Panel):
|
||||
draw_psetqto_ui(context, pset["id"], pset, props, self.layout, "Resource")
|
||||
|
||||
|
||||
class BIM_PT_group_qtos(Panel):
|
||||
bl_label = "Group Quantity Sets"
|
||||
bl_idname = "BIM_PT_group_qtos"
|
||||
bl_options = {"DEFAULT_CLOSED"}
|
||||
bl_space_type = "PROPERTIES"
|
||||
bl_region_type = "WINDOW"
|
||||
bl_context = "scene"
|
||||
bl_parent_id = "BIM_PT_groups"
|
||||
|
||||
@classmethod
|
||||
def poll(cls, context):
|
||||
props = context.scene.BIMGroupProperties
|
||||
total_resources = len(props.groups)
|
||||
if total_resources > 0 and props.active_group_index < total_resources:
|
||||
return True
|
||||
return False
|
||||
|
||||
def draw(self, context):
|
||||
if not GroupQtosData.is_loaded:
|
||||
GroupQtosData.load()
|
||||
|
||||
props = context.scene.GroupPsetProperties
|
||||
row = self.layout.row(align=True)
|
||||
row.prop(props, "qto_name", text="")
|
||||
op = row.operator("bim.add_qto", icon="ADD", text="")
|
||||
op.obj_type = "Group"
|
||||
|
||||
if not props.active_pset_id and props.active_pset_name and props.active_pset_type == "QTO":
|
||||
draw_psetqto_ui(context, 0, {}, props, self.layout, "Group")
|
||||
|
||||
for qto in GroupQtosData.data["qtos"]:
|
||||
draw_psetqto_ui(context, qto["id"], qto, props, self.layout, "Group")
|
||||
|
||||
|
||||
class BIM_PT_group_psets(Panel):
|
||||
bl_label = "Group Property Sets"
|
||||
bl_idname = "BIM_PT_group_psets"
|
||||
bl_options = {"DEFAULT_CLOSED"}
|
||||
bl_space_type = "PROPERTIES"
|
||||
bl_region_type = "WINDOW"
|
||||
bl_context = "scene"
|
||||
bl_parent_id = "BIM_PT_groups"
|
||||
|
||||
@classmethod
|
||||
def poll(cls, context):
|
||||
props = context.scene.BIMGroupProperties
|
||||
total_resources = len(props.groups)
|
||||
if total_resources > 0 and props.active_group_index < total_resources:
|
||||
return True
|
||||
return False
|
||||
|
||||
def draw(self, context):
|
||||
if not GroupPsetData.is_loaded:
|
||||
GroupPsetData.load()
|
||||
|
||||
props = context.scene.GroupPsetProperties
|
||||
row = self.layout.row(align=True)
|
||||
prop_with_search(row, props, "pset_name", text="")
|
||||
op = row.operator("bim.add_pset", icon="ADD", text="")
|
||||
op.obj_type = "Group"
|
||||
|
||||
if not props.active_pset_id and props.active_pset_name and props.active_pset_type == "PSET":
|
||||
draw_psetqto_ui(context, 0, {}, props, self.layout, "Group")
|
||||
|
||||
for pset in GroupPsetData.data["psets"]:
|
||||
draw_psetqto_ui(context, pset["id"], pset, props, self.layout, "Group")
|
||||
|
||||
|
||||
|
||||
|
||||
class BIM_PT_profile_psets(Panel):
|
||||
bl_label = "Profile Property Sets"
|
||||
bl_idname = "BIM_PT_profile_psets"
|
||||
|
||||
@@ -139,6 +139,9 @@ class Blender(blenderbim.core.tool.Blender):
|
||||
].ifc_definition_id
|
||||
elif obj_type == "WorkSchedule":
|
||||
return bpy.context.scene.BIMWorkScheduleProperties.active_work_schedule_id
|
||||
elif obj_type == "Group":
|
||||
prop = bpy.context.scene.BIMGroupProperties
|
||||
return prop.groups[prop.active_group_index].ifc_definition_id
|
||||
|
||||
@classmethod
|
||||
def is_ifc_object(cls, obj):
|
||||
|
||||
Reference in New Issue
Block a user