mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-26 02:07:36 +00:00
bim.unlink_style - make it more safe
Even if user decide not to delete style during unlinking, we will create a material copy and relink style to it, so it will be safe to assume that each surface style is always linked to blender material.
This commit is contained in:
@@ -50,7 +50,7 @@ class StylesData:
|
|||||||
materials: dict[bpy.types.PropertyGroup, Union[str, None]] = {}
|
materials: dict[bpy.types.PropertyGroup, Union[str, None]] = {}
|
||||||
for style in props.styles:
|
for style in props.styles:
|
||||||
material = tool.Ifc.get_object(ifc_file.by_id(style.ifc_definition_id))
|
material = tool.Ifc.get_object(ifc_file.by_id(style.ifc_definition_id))
|
||||||
# Material will be None if it's either unlinked or if it's not IfcSurfaceStyle.
|
# Material will be None if it's not IfcSurfaceStyle.
|
||||||
materials[style] = material.name if material is not None else None
|
materials[style] = material.name if material is not None else None
|
||||||
return materials
|
return materials
|
||||||
|
|
||||||
|
|||||||
@@ -98,7 +98,7 @@ class UnlinkStyle(bpy.types.Operator, tool.Ifc.Operator):
|
|||||||
bl_description = (
|
bl_description = (
|
||||||
"Unlink Blender material from it's linked IFC style.\n\n"
|
"Unlink Blender material from it's linked IFC style.\n\n"
|
||||||
"You can either remove style the material is linked to from IFC or keep it. "
|
"You can either remove style the material is linked to from IFC or keep it. "
|
||||||
"Note that keeping the unlinked style in IFC might lead to unpredictable issues "
|
"Note that keeping the style in IFC might lead to unpredictable issues "
|
||||||
"and should be used only by advanced users"
|
"and should be used only by advanced users"
|
||||||
)
|
)
|
||||||
bl_options = {"REGISTER", "UNDO"}
|
bl_options = {"REGISTER", "UNDO"}
|
||||||
@@ -125,17 +125,22 @@ class UnlinkStyle(bpy.types.Operator, tool.Ifc.Operator):
|
|||||||
tool.Ifc.unlink(obj=material)
|
tool.Ifc.unlink(obj=material)
|
||||||
return {"FINISHED"}
|
return {"FINISHED"}
|
||||||
|
|
||||||
|
# Create a copy that will be removed / left unassigned
|
||||||
|
# and leave user with unlinked original material.
|
||||||
|
#
|
||||||
|
# Note should_delete=False creates a weird session state
|
||||||
|
# when style is assigned to geometry in IFC
|
||||||
|
# but mesh material is using some non-IFC Blender material instead.
|
||||||
|
# In this case we still create a material copy and relink style to it,
|
||||||
|
# so it will be still safe to assume that get_object(surface_style) is not None
|
||||||
|
# saving us from possible errors.
|
||||||
|
material_copy = material.copy()
|
||||||
|
tool.Ifc.unlink(element=style)
|
||||||
|
tool.Ifc.link(style, material_copy)
|
||||||
if self.should_delete:
|
if self.should_delete:
|
||||||
# Create a copy that will be removed
|
|
||||||
# and leave user with unlinked original material.
|
|
||||||
# It's needed so we don't need to search everywhere original
|
|
||||||
# material was used and replace it with the unlinked version.
|
|
||||||
material_copy = material.copy()
|
|
||||||
tool.Ifc.unlink(element=style)
|
|
||||||
tool.Ifc.link(style, material_copy)
|
|
||||||
core.remove_style(tool.Ifc, tool.Style, style)
|
core.remove_style(tool.Ifc, tool.Style, style)
|
||||||
else:
|
else:
|
||||||
tool.Ifc.unlink(element=style)
|
material_copy.use_fake_user = True
|
||||||
|
|
||||||
# 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
|
||||||
|
|||||||
Reference in New Issue
Block a user