mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-10 22:16:41 +00:00
More complete fix for breaking styles ui e85043ae3
Now it also doesn't break if user will undo style rename.
This commit is contained in:
@@ -36,24 +36,12 @@ class StylesData:
|
|||||||
@classmethod
|
@classmethod
|
||||||
def load(cls):
|
def load(cls):
|
||||||
cls.data = {
|
cls.data = {
|
||||||
"styles_to_blender_material_names": cls.styles_to_blender_material_names(),
|
|
||||||
"style_types": cls.style_types(),
|
"style_types": cls.style_types(),
|
||||||
"total_styles": cls.total_styles(),
|
"total_styles": cls.total_styles(),
|
||||||
"reflectance_methods": cls.reflectance_methods(),
|
"reflectance_methods": cls.reflectance_methods(),
|
||||||
}
|
}
|
||||||
cls.is_loaded = True
|
cls.is_loaded = True
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def styles_to_blender_material_names(cls) -> list[Union[str, None]]:
|
|
||||||
ifc_file = tool.Ifc.get()
|
|
||||||
props = bpy.context.scene.BIMStylesProperties
|
|
||||||
materials: list[Union[str, None]] = []
|
|
||||||
for style in props.styles:
|
|
||||||
material = tool.Ifc.get_object(ifc_file.by_id(style.ifc_definition_id))
|
|
||||||
# Material will be None if it's not IfcSurfaceStyle.
|
|
||||||
materials.append(material.name if material is not None else None)
|
|
||||||
return materials
|
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def reflectance_methods(cls):
|
def reflectance_methods(cls):
|
||||||
declaration = tool.Ifc.schema().declaration_by_name("IfcReflectanceMethodEnum")
|
declaration = tool.Ifc.schema().declaration_by_name("IfcReflectanceMethodEnum")
|
||||||
|
|||||||
@@ -141,6 +141,13 @@ class UnlinkStyle(bpy.types.Operator, tool.Ifc.Operator):
|
|||||||
core.remove_style(tool.Ifc, tool.Style, style)
|
core.remove_style(tool.Ifc, tool.Style, style)
|
||||||
else:
|
else:
|
||||||
material_copy.use_fake_user = True
|
material_copy.use_fake_user = True
|
||||||
|
# Need to reload Styles UI since it's item is now pointing to wrong Blender material.
|
||||||
|
if (
|
||||||
|
tool.Style.is_editing_styles()
|
||||||
|
and (style_type := tool.Style.get_active_style_type())
|
||||||
|
and style_type == style.is_a()
|
||||||
|
):
|
||||||
|
tool.Style.import_presentation_styles(style_type)
|
||||||
|
|
||||||
# Ensure there won't be any style sync on project save:
|
# Ensure there won't be any style sync on project save:
|
||||||
# bim.update_representation would create new IfcSurfaceStyle
|
# bim.update_representation would create new IfcSurfaceStyle
|
||||||
|
|||||||
@@ -69,6 +69,13 @@ class Style(PropertyGroup):
|
|||||||
diffuse_colour: bpy.props.FloatVectorProperty(
|
diffuse_colour: bpy.props.FloatVectorProperty(
|
||||||
name="Diffuse Colour", subtype="COLOR", default=(1, 1, 1), min=0.0, max=1.0, size=3
|
name="Diffuse Colour", subtype="COLOR", default=(1, 1, 1), min=0.0, max=1.0, size=3
|
||||||
)
|
)
|
||||||
|
blender_material: PointerProperty(
|
||||||
|
description=(
|
||||||
|
"Needed for UI to have style->blender material link that won't break on undo. "
|
||||||
|
"Can be None if it's not a surface style"
|
||||||
|
),
|
||||||
|
type=bpy.types.Material,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
STYLE_TYPES = [
|
STYLE_TYPES = [
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ class BIM_PT_styles(Panel):
|
|||||||
row.operator("bim.load_styles", text="", icon="IMPORT").style_type = style_type
|
row.operator("bim.load_styles", text="", icon="IMPORT").style_type = style_type
|
||||||
return
|
return
|
||||||
|
|
||||||
active_style = self.props.styles and self.props.active_style_index < len(self.props.styles)
|
active_style = bool(self.props.styles and self.props.active_style_index < len(self.props.styles))
|
||||||
row = self.layout.row(align=True)
|
row = self.layout.row(align=True)
|
||||||
row.label(text="{} {}s".format(len(self.props.styles), self.props.style_type), icon="SHADING_RENDERED")
|
row.label(text="{} {}s".format(len(self.props.styles), self.props.style_type), icon="SHADING_RENDERED")
|
||||||
row.operator("bim.disable_editing_styles", text="", icon="CANCEL")
|
row.operator("bim.disable_editing_styles", text="", icon="CANCEL")
|
||||||
@@ -95,9 +95,7 @@ class BIM_PT_styles(Panel):
|
|||||||
# style ui tools
|
# style ui tools
|
||||||
if active_style:
|
if active_style:
|
||||||
row = self.layout.row(align=True)
|
row = self.layout.row(align=True)
|
||||||
material_name = StylesData.data["styles_to_blender_material_names"][self.props.active_style_index]
|
if material := style.blender_material:
|
||||||
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="")
|
row.prop(material.BIMStyleProperties, "active_style_type", icon="SHADING_RENDERED", text="")
|
||||||
op = row.operator("bim.update_current_style", icon="FILE_REFRESH", text="")
|
op = row.operator("bim.update_current_style", icon="FILE_REFRESH", text="")
|
||||||
op.style_id = style.ifc_definition_id
|
op.style_id = style.ifc_definition_id
|
||||||
@@ -268,9 +266,8 @@ class BIM_UL_styles(UIList):
|
|||||||
def draw_item(self, context, layout, data, item, icon, active_data, active_propname, index):
|
def draw_item(self, context, layout, data, item, icon, active_data, active_propname, index):
|
||||||
if item:
|
if item:
|
||||||
row = layout.row(align=True)
|
row = layout.row(align=True)
|
||||||
material_name: Union[str, None] = StylesData.data["styles_to_blender_material_names"][index]
|
|
||||||
material_icon = 0
|
material_icon = 0
|
||||||
if material_name and (material := bpy.data.materials.get(material_name)):
|
if material := item.blender_material:
|
||||||
preview = material.preview_ensure()
|
preview = material.preview_ensure()
|
||||||
material_icon = preview.icon_id
|
material_icon = preview.icon_id
|
||||||
row.prop(item, "name", text="", emboss=False, icon_value=material_icon)
|
row.prop(item, "name", text="", emboss=False, icon_value=material_icon)
|
||||||
|
|||||||
@@ -521,6 +521,7 @@ class Style(bonsai.core.tool.Style):
|
|||||||
for style in styles:
|
for style in styles:
|
||||||
new = props.styles.add()
|
new = props.styles.add()
|
||||||
new.ifc_definition_id = style.id()
|
new.ifc_definition_id = style.id()
|
||||||
|
new.blender_material = tool.Ifc.get_object(style)
|
||||||
new["name"] = style.Name or "Unnamed" # Avoid writing to IFC through callback.
|
new["name"] = style.Name or "Unnamed" # Avoid writing to IFC through callback.
|
||||||
new.ifc_class = style.is_a()
|
new.ifc_class = style.is_a()
|
||||||
for surface_style in getattr(style, "Styles", []) or []:
|
for surface_style in getattr(style, "Styles", []) or []:
|
||||||
|
|||||||
Reference in New Issue
Block a user