diff --git a/src/blenderbim/blenderbim/bim/module/style/__init__.py b/src/blenderbim/blenderbim/bim/module/style/__init__.py index becd598f33..fb1ece3cb0 100644 --- a/src/blenderbim/blenderbim/bim/module/style/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/style/__init__.py @@ -50,8 +50,6 @@ classes = ( prop.BIMStylesProperties, prop.BIMStyleProperties, ui.BIM_PT_styles, - ui.BIM_PT_style, - ui.BIM_PT_style_attributes, ui.BIM_UL_styles, ) diff --git a/src/blenderbim/blenderbim/bim/module/style/data.py b/src/blenderbim/blenderbim/bim/module/style/data.py index 0863e9623a..9a6cab4819 100644 --- a/src/blenderbim/blenderbim/bim/module/style/data.py +++ b/src/blenderbim/blenderbim/bim/module/style/data.py @@ -24,7 +24,6 @@ from ifcopenshell.util.doc import get_entity_doc def refresh(): StylesData.is_loaded = False - StyleAttributesData.is_loaded = False class StylesData: @@ -68,30 +67,3 @@ class StylesData: @classmethod def total_styles(cls): return len(tool.Ifc.get().by_type("IfcPresentationStyle")) - - -class StyleAttributesData: - data = {} - is_loaded = False - - @classmethod - def load(cls): - cls.data = { - "ifc_style_id": cls.ifc_style_id(), - "attributes": cls.attributes(), - } - cls.is_loaded = True - - @classmethod - def ifc_style_id(cls): - return bpy.context.active_object.active_material.BIMMaterialProperties.ifc_style_id - - @classmethod - def attributes(cls): - style = tool.Ifc.get().by_id(bpy.context.active_object.active_material.BIMMaterialProperties.ifc_style_id) - results = [] - for name, value in style.get_info().items(): - if name in ["id", "type", "Styles"]: - continue - results.append({"name": name, "value": str(value)}) - return results diff --git a/src/blenderbim/blenderbim/bim/module/style/operator.py b/src/blenderbim/blenderbim/bim/module/style/operator.py index e59e60da74..e8b0479f9c 100644 --- a/src/blenderbim/blenderbim/bim/module/style/operator.py +++ b/src/blenderbim/blenderbim/bim/module/style/operator.py @@ -28,6 +28,7 @@ from pathlib import Path from mathutils import Vector +# TODO: is this still relevant or can it be deleted? class UpdateStyleColours(bpy.types.Operator, tool.Ifc.Operator): bl_idname = "bim.update_style_colours" bl_label = "Save Current Shading Style" @@ -53,6 +54,7 @@ class UpdateStyleColours(bpy.types.Operator, tool.Ifc.Operator): self.report({"INFO"}, "Check the system console to see saved style properties") +# TODO: is this still relevant or can it be deleted? class UpdateStyleTextures(bpy.types.Operator, tool.Ifc.Operator): bl_idname = "bim.update_style_textures" bl_label = "Update Style Textures" @@ -93,9 +95,10 @@ class UnlinkStyle(bpy.types.Operator, tool.Ifc.Operator): bl_idname = "bim.unlink_style" bl_label = "Unlink Style" bl_options = {"REGISTER", "UNDO"} + style: bpy.props.IntProperty(default=0) def _execute(self, context): - core.unlink_style(tool.Ifc, tool.Style, obj=context.active_object.active_material) + core.unlink_style(tool.Ifc, style=tool.Ifc.get().by_id(self.style)) class EnableEditingStyle(bpy.types.Operator, tool.Ifc.Operator): diff --git a/src/blenderbim/blenderbim/bim/module/style/ui.py b/src/blenderbim/blenderbim/bim/module/style/ui.py index 5c1bdf06a9..571696b187 100644 --- a/src/blenderbim/blenderbim/bim/module/style/ui.py +++ b/src/blenderbim/blenderbim/bim/module/style/ui.py @@ -21,7 +21,7 @@ import blenderbim.bim.helper import blenderbim.tool as tool from bpy.types import Panel, UIList from blenderbim.bim.ifc import IfcStore -from blenderbim.bim.module.style.data import StylesData, StyleAttributesData +from blenderbim.bim.module.style.data import StylesData from bl_ui.properties_material import MaterialButtonsPanel @@ -62,11 +62,11 @@ class BIM_PT_styles(Panel): row.operator("bim.enable_adding_presentation_style", text="", icon="ADD") if active_style: style = self.props.styles[self.props.active_style_index] - material_name = StylesData.data["styles_to_blender_material_names"][self.props.active_style_index] - material = bpy.data.materials[material_name] row.operator("bim.duplicate_style", text="", icon="DUPLICATE").style = style.ifc_definition_id row.operator("bim.select_by_style", text="", icon="RESTRICT_SELECT_OFF").style = style.ifc_definition_id + op = row.operator("bim.unlink_style", text="", icon="UNLINKED") + op.style = style.ifc_definition_id op = row.operator("bim.enable_editing_style", text="", icon="GREASEPENCIL") op.style = style.ifc_definition_id row.operator("bim.remove_style", text="", icon="X").style = style.ifc_definition_id @@ -93,9 +93,12 @@ class BIM_PT_styles(Panel): # style ui tools if active_style: row = self.layout.row(align=True) - row.prop(material.BIMStyleProperties, "active_style_type", icon="SHADING_RENDERED", text="") - op = row.operator("bim.update_current_style", icon="FILE_REFRESH", text="") - op.style_id = style.ifc_definition_id + material_name = StylesData.data["styles_to_blender_material_names"][self.props.active_style_index] + if material_name: # The user may have unlinked the style, so the material may not exist + material = bpy.data.materials[material_name] + row.prop(material.BIMStyleProperties, "active_style_type", icon="SHADING_RENDERED", text="") + op = row.operator("bim.update_current_style", icon="FILE_REFRESH", text="") + op.style_id = style.ifc_definition_id if self.props.style_type == "IfcSurfaceStyle": self.layout.label(text="Surface Style Element:") @@ -259,80 +262,6 @@ class BIM_PT_styles(Panel): row.operator("bim.disable_editing_style", text="", icon="CANCEL") -class BIM_PT_style(MaterialButtonsPanel, Panel): - bl_label = "Style" - bl_idname = "BIM_PT_style" - bl_space_type = "PROPERTIES" - bl_region_type = "WINDOW" - bl_context = "material" - - @classmethod - def poll(cls, context): - return ( - IfcStore.get_file() - and context.active_object is not None - and context.active_object.active_material is not None - ) - - def draw(self, context): - mat = context.material - props = mat.BIMMaterialProperties - row = self.layout.row(align=True) - if not props.ifc_style_id: - row.operator("bim.add_style", icon="ADD") - return - row = self.layout.row(align=True) - row.operator("bim.update_style_colours", icon="GREASEPENCIL") - row.operator("bim.update_style_textures", icon="TEXTURE", text="") - row.operator("bim.unlink_style", icon="UNLINKED", text="") - row.operator("bim.remove_style", icon="X", text="").style = props.ifc_style_id - - -class BIM_PT_style_attributes(Panel): - bl_label = "Style Attributes" - bl_idname = "BIM_PT_style_attributes" - bl_space_type = "PROPERTIES" - bl_region_type = "WINDOW" - bl_context = "material" - bl_parent_id = "BIM_PT_style" - - @classmethod - def poll(cls, context): - if not IfcStore.get_file(): - return False - try: - return bool(context.active_object.active_material.BIMMaterialProperties.ifc_style_id) - except: - return False - - def draw(self, context): - if not StyleAttributesData.is_loaded: - StyleAttributesData.load() - elif ( - context.active_object.active_material.BIMMaterialProperties.ifc_style_id - != StyleAttributesData.data["ifc_style_id"] - ): - StyleAttributesData.load() - - obj = context.active_object.active_material - mprops = obj.BIMMaterialProperties - props = obj.BIMStyleProperties - if props.is_editing: - row = self.layout.row(align=True) - row.operator("bim.edit_style", icon="CHECKMARK") - row.operator("bim.disable_editing_style", icon="CANCEL", text="") - blenderbim.bim.helper.draw_attributes(props.attributes, self.layout) - else: - row = self.layout.row(align=True) - row.label(text="STEP ID") - row.label(text=str(mprops.ifc_style_id)) - - for attribute in StyleAttributesData.data["attributes"]: - row = self.layout.row(align=True) - row.label(text=attribute["name"]) - row.label(text=attribute["value"]) - - class BIM_UL_styles(UIList): def draw_item(self, context, layout, data, item, icon, active_data, active_propname): if item: diff --git a/src/blenderbim/blenderbim/core/style.py b/src/blenderbim/blenderbim/core/style.py index c700207894..13576cb80f 100644 --- a/src/blenderbim/blenderbim/core/style.py +++ b/src/blenderbim/blenderbim/core/style.py @@ -111,8 +111,9 @@ def update_style_textures(ifc, style, obj=None, representation=None): ifc.run("style.remove_surface_style", style=texture_style) -def unlink_style(ifc, style, obj=None): - ifc.unlink(obj=obj, element=style.get_style(obj)) +def unlink_style(ifc, style=None): + obj = ifc.get_object(style) + ifc.unlink(obj=obj, element=style) def enable_editing_style(style, obj=None): diff --git a/src/blenderbim/blenderbim/tool/material.py b/src/blenderbim/blenderbim/tool/material.py index 03a7cf940d..5c76fa6197 100644 --- a/src/blenderbim/blenderbim/tool/material.py +++ b/src/blenderbim/blenderbim/tool/material.py @@ -38,12 +38,6 @@ class Material(blenderbim.core.tool.Material): def disable_editing_materials(cls): bpy.context.scene.BIMMaterialProperties.is_editing = False - @classmethod - def duplicate_material(cls, material: ifcopenshell.entity_instance) -> ifcopenshell.entity_instance: - new_material = ifcopenshell.util.element.copy_deep(tool.Ifc.get(), material) - new_material.Name = material.Name + "_copy" - return new_material - @classmethod def enable_editing_materials(cls): bpy.context.scene.BIMMaterialProperties.is_editing = True @@ -255,3 +249,12 @@ class Material(blenderbim.core.tool.Material): obj = tool.Ifc.get_object(style) if obj: obj.name = name + + @classmethod + def get_style(cls, material): + for material_representation in material.HasRepresentation: + for representation in material_representation.Representations: + for item in representation.Items: + for style in item.Styles: + if style.is_a("IfcSurfaceStyle"): + return style