mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-23 18:26:25 +00:00
BBIM - fix invalid representation item style assignment in ifc2x3
It wasn't considering IfcPresentationStyleAssignment.
This commit is contained in:
@@ -565,26 +565,67 @@ class Style(blenderbim.core.tool.Style):
|
|||||||
def assign_style_to_representation_item(
|
def assign_style_to_representation_item(
|
||||||
cls, representation_item: ifcopenshell.entity_instance, style: Optional[ifcopenshell.entity_instance] = None
|
cls, representation_item: ifcopenshell.entity_instance, style: Optional[ifcopenshell.entity_instance] = None
|
||||||
) -> None:
|
) -> None:
|
||||||
ifc_file = tool.Ifc.get()
|
"""Assign specified style to a representation item and unassign all previously assigned styles."""
|
||||||
if not representation_item.StyledByItem:
|
ifc_file = representation_item.file
|
||||||
|
if not (styled_item := next(iter(representation_item.StyledByItem), None)):
|
||||||
if style is None:
|
if style is None:
|
||||||
return
|
return
|
||||||
ifc_file.createIfcStyledItem(representation_item, (style,))
|
if ifc_file.schema == "IFC2X3":
|
||||||
|
style = ifc_file.create_entity("IfcPresentationStyleAssignment", (style,))
|
||||||
|
ifc_file.create_entity("IfcStyledItem", representation_item, (style,))
|
||||||
|
return
|
||||||
|
|
||||||
|
styled_item_styles = styled_item.Styles
|
||||||
|
if style and styled_item_styles == (style,):
|
||||||
|
return
|
||||||
|
|
||||||
|
if ifc_file.schema == "IFC4X3":
|
||||||
|
if style is None:
|
||||||
|
ifc_file.remove(styled_item)
|
||||||
|
return
|
||||||
|
styled_item.Styles = (style,)
|
||||||
|
return
|
||||||
|
|
||||||
|
# < IFC4X3
|
||||||
|
# Can't just remove a styled item or assign a style
|
||||||
|
# since we need to remove/change the possible style assignments.
|
||||||
|
assignment = None
|
||||||
|
for style_ in styled_item_styles:
|
||||||
|
if not style_.is_a("IfcPresentationStyleAssignment"):
|
||||||
|
continue
|
||||||
|
# Remove second assignment.
|
||||||
|
if style is None or assignment:
|
||||||
|
ifc_file.remove(style_)
|
||||||
|
else:
|
||||||
|
assignment = style_
|
||||||
|
if assignment.Styles != (style,):
|
||||||
|
assignment.Styles = (style,)
|
||||||
|
|
||||||
styled_item = representation_item.StyledByItem[0]
|
|
||||||
if style is None:
|
if style is None:
|
||||||
ifc_file.remove(styled_item)
|
ifc_file.remove(styled_item)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
if assignment:
|
||||||
|
if styled_item_styles == (assignment,):
|
||||||
|
return
|
||||||
|
styled_item.Styles = (assignment,)
|
||||||
|
return
|
||||||
|
|
||||||
styled_item.Styles = (style,)
|
styled_item.Styles = (style,)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def get_representation_item_style(
|
def get_representation_item_style(
|
||||||
cls, representation_item: ifcopenshell.entity_instance
|
cls, representation_item: ifcopenshell.entity_instance
|
||||||
) -> Union[ifcopenshell.entity_instance, None]:
|
) -> Union[ifcopenshell.entity_instance, None]:
|
||||||
for inverse in tool.Ifc.get().get_inverse(representation_item):
|
"""Return IfcPresentationStyle associated with a representation item."""
|
||||||
if inverse.is_a("IfcStyledItem"):
|
is_4x3 = representation_item.file.schema == "IFC4X3"
|
||||||
for style in inverse.Styles:
|
for style in representation_item.StyledByItem:
|
||||||
return style
|
for style_or_assignment in style.Styles:
|
||||||
|
if not is_4x3 and style_or_assignment.is_a("IfcPresentationStyleAssignment"):
|
||||||
|
for assignment_style in style_or_assignment.Styles:
|
||||||
|
return assignment_style
|
||||||
|
else: # IfcPresentationStyle
|
||||||
|
return style_or_assignment
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def reload_material_from_ifc(cls, blender_material: bpy.types.Material) -> None:
|
def reload_material_from_ifc(cls, blender_material: bpy.types.Material) -> None:
|
||||||
|
|||||||
Reference in New Issue
Block a user