mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-08-12 10:33:20 +00:00
Add support for editing material set item psets.
This commit is contained in:
@@ -212,6 +212,8 @@ def get_obj_ifc_definition_id(context, obj, obj_type):
|
||||
return ifcopenshell.util.element.get_material(
|
||||
tool.Ifc.get_entity(bpy.data.objects.get(obj)), should_skip_usage=True
|
||||
).id()
|
||||
elif obj_type == "MaterialSetItem":
|
||||
return bpy.data.objects.get(obj).BIMObjectMaterialProperties.active_material_set_item_id
|
||||
elif obj_type == "Task":
|
||||
return context.scene.BIMTaskTreeProperties.tasks[
|
||||
context.scene.BIMWorkScheduleProperties.active_task_index
|
||||
|
||||
@@ -42,6 +42,7 @@ classes = (
|
||||
prop.PsetProperties,
|
||||
prop.MaterialPsetProperties,
|
||||
prop.MaterialSetPsetProperties,
|
||||
prop.MaterialSetItemPsetProperties,
|
||||
prop.TaskPsetProperties,
|
||||
prop.ResourcePsetProperties,
|
||||
prop.ProfilePsetProperties,
|
||||
@@ -53,6 +54,7 @@ classes = (
|
||||
ui.BIM_PT_object_qtos,
|
||||
ui.BIM_PT_material_psets,
|
||||
ui.BIM_PT_material_set_psets,
|
||||
ui.BIM_PT_material_set_item_psets,
|
||||
ui.BIM_PT_task_qtos,
|
||||
ui.BIM_PT_resource_qtos,
|
||||
ui.BIM_PT_resource_psets,
|
||||
@@ -68,6 +70,7 @@ classes = (
|
||||
def register():
|
||||
bpy.types.Object.PsetProperties = bpy.props.PointerProperty(type=prop.PsetProperties)
|
||||
bpy.types.Object.MaterialSetPsetProperties = bpy.props.PointerProperty(type=prop.MaterialSetPsetProperties)
|
||||
bpy.types.Object.MaterialSetItemPsetProperties = bpy.props.PointerProperty(type=prop.MaterialSetItemPsetProperties)
|
||||
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)
|
||||
|
||||
@@ -30,6 +30,7 @@ def refresh():
|
||||
ObjectQtosData.is_loaded = False
|
||||
MaterialPsetsData.is_loaded = False
|
||||
MaterialSetPsetsData.is_loaded = False
|
||||
MaterialSetItemPsetsData.is_loaded = False
|
||||
TaskQtosData.is_loaded = False
|
||||
ResourceQtosData.is_loaded = False
|
||||
ResourcePsetsData.is_loaded = False
|
||||
@@ -115,6 +116,20 @@ class MaterialSetPsetsData(Data):
|
||||
cls.is_loaded = True
|
||||
|
||||
|
||||
class MaterialSetItemPsetsData(Data):
|
||||
data = {}
|
||||
is_loaded = False
|
||||
|
||||
@classmethod
|
||||
def load(cls):
|
||||
psets = {}
|
||||
ifc_definition_id = bpy.context.active_object.BIMObjectMaterialProperties.active_material_set_item_id
|
||||
if ifc_definition_id:
|
||||
psets = cls.psetqtos(tool.Ifc.get().by_id(ifc_definition_id))
|
||||
cls.data = {"psets": psets}
|
||||
cls.is_loaded = True
|
||||
|
||||
|
||||
class TaskQtosData(Data):
|
||||
data = {}
|
||||
is_loaded = False
|
||||
|
||||
@@ -50,6 +50,8 @@ def get_pset_props(context, obj, obj_type):
|
||||
return bpy.data.materials.get(obj).PsetProperties
|
||||
elif obj_type == "MaterialSet":
|
||||
return bpy.data.objects.get(obj).MaterialSetPsetProperties
|
||||
elif obj_type == "MaterialSetItem":
|
||||
return bpy.data.objects.get(obj).MaterialSetItemPsetProperties
|
||||
elif obj_type == "Task":
|
||||
return context.scene.TaskPsetProperties
|
||||
elif obj_type == "Resource":
|
||||
|
||||
@@ -97,6 +97,18 @@ def get_material_set_pset_names(self, context):
|
||||
return psetnames[ifc_class]
|
||||
|
||||
|
||||
def get_material_set_item_pset_names(self, context):
|
||||
global psetnames
|
||||
ifc_definition_id = context.active_object.BIMObjectMaterialProperties.active_material_set_item_id
|
||||
if not ifc_definition_id:
|
||||
return []
|
||||
ifc_class = tool.Ifc.get().by_id(ifc_definition_id).is_a()
|
||||
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_task_qto_names(self, context):
|
||||
global qtonames
|
||||
ifc_class = "IfcTask"
|
||||
@@ -204,6 +216,13 @@ class MaterialSetPsetProperties(PropertyGroup):
|
||||
pset_name: EnumProperty(items=get_material_set_pset_names, name="Pset Name")
|
||||
|
||||
|
||||
class MaterialSetItemPsetProperties(PropertyGroup):
|
||||
active_pset_id: IntProperty(name="Active Pset ID")
|
||||
active_pset_name: StringProperty(name="Pset Name")
|
||||
properties: CollectionProperty(name="Properties", type=IfcProperty)
|
||||
pset_name: EnumProperty(items=get_material_set_item_pset_names, name="Pset Name")
|
||||
|
||||
|
||||
class TaskPsetProperties(PropertyGroup):
|
||||
active_pset_id: IntProperty(name="Active Pset ID")
|
||||
active_pset_name: StringProperty(name="Pset Name")
|
||||
|
||||
@@ -25,6 +25,7 @@ from blenderbim.bim.module.pset.data import (
|
||||
ObjectQtosData,
|
||||
MaterialPsetsData,
|
||||
MaterialSetPsetsData,
|
||||
MaterialSetItemPsetsData,
|
||||
TaskQtosData,
|
||||
ResourceQtosData,
|
||||
ResourcePsetsData,
|
||||
@@ -79,6 +80,8 @@ def get_active_pset_obj_name(context, obj_type):
|
||||
return context.active_object.active_material.name
|
||||
elif obj_type == "MaterialSet":
|
||||
return context.active_object.name
|
||||
elif obj_type == "MaterialSetItem":
|
||||
return context.active_object.name
|
||||
return ""
|
||||
|
||||
|
||||
@@ -305,6 +308,41 @@ class BIM_PT_material_set_psets(Panel):
|
||||
draw_psetqto_ui(context, pset["id"], pset, props, self.layout, "MaterialSet")
|
||||
|
||||
|
||||
class BIM_PT_material_set_item_psets(Panel):
|
||||
bl_label = "IFC Material Set Item Property Sets"
|
||||
bl_idname = "BIM_PT_material_set_item_psets"
|
||||
bl_options = {"DEFAULT_CLOSED"}
|
||||
bl_space_type = "PROPERTIES"
|
||||
bl_region_type = "WINDOW"
|
||||
bl_context = "object"
|
||||
bl_parent_id = "BIM_PT_object_material"
|
||||
|
||||
@classmethod
|
||||
def poll(cls, context):
|
||||
if not context.active_object:
|
||||
return False
|
||||
if not tool.Ifc.get() or tool.Ifc.get().schema == "IFC2X3":
|
||||
return False # We don't support material psets in IFC2X3 because they suck
|
||||
if not tool.Ifc.get_entity(context.active_object):
|
||||
return False
|
||||
return True
|
||||
|
||||
def draw(self, context):
|
||||
if not MaterialSetItemPsetsData.is_loaded:
|
||||
MaterialSetItemPsetsData.load()
|
||||
|
||||
props = context.active_object.MaterialSetItemPsetProperties
|
||||
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 = context.active_object.name
|
||||
op.obj_type = "MaterialSetItem"
|
||||
|
||||
for pset in MaterialSetItemPsetsData.data["psets"]:
|
||||
draw_psetqto_ui(context, pset["id"], pset, props, self.layout, "MaterialSetItem")
|
||||
|
||||
|
||||
|
||||
class BIM_PT_task_qtos(Panel):
|
||||
bl_label = "IFC Task Quantity Sets"
|
||||
bl_idname = "BIM_PT_task_qtos"
|
||||
|
||||
Reference in New Issue
Block a user