diff --git a/src/blenderbim/blenderbim/bim/module/model/door.py b/src/blenderbim/blenderbim/bim/module/model/door.py index c029685536..59221aac54 100644 --- a/src/blenderbim/blenderbim/bim/module/model/door.py +++ b/src/blenderbim/blenderbim/bim/module/model/door.py @@ -43,6 +43,7 @@ def update_door_modifier_representation(context): props = obj.BIMDoorProperties element = tool.Ifc.get_entity(obj) ifc_file = tool.Ifc.get() + sliding_door = "SLIDING" in props.door_type representation_data = { "operation_type": props.door_type, @@ -87,13 +88,37 @@ def update_door_modifier_representation(context): model_representation = ifcopenshell.api.run("geometry.add_door_representation", ifc_file, **representation_data) tool.Model.replace_object_ifc_representation(body, obj, model_representation) - # PLAN_VIEW representation - plan = ifcopenshell.util.representation.get_context(ifc_file, "Plan", "Body", "PLAN_VIEW") - if plan: - representation_data["context"] = plan + # Body/PLAN_VIEW representation + plan_body = ifcopenshell.util.representation.get_context(ifc_file, "Plan", "Body", "PLAN_VIEW") + if plan_body: + representation_data["context"] = plan_body plan_representation = ifcopenshell.api.run("geometry.add_door_representation", ifc_file, **representation_data) - tool.Model.replace_object_ifc_representation(plan, obj, plan_representation) + tool.Model.replace_object_ifc_representation(plan_body, obj, plan_representation) + # Annotation/PLAN_VIEW representation + plan_annotation = ifcopenshell.util.representation.get_context(ifc_file, "Plan", "Annotation", "PLAN_VIEW") + if plan_annotation: + if not sliding_door: + # only sliding doors have Annotation/PLAN_VIEW + # for other types we just check for old representation and remove it if it's there + old_representation = ifcopenshell.util.representation.get_representation( + element, "Plan", "Annotation", "PLAN_VIEW" + ) + if old_representation: + core.remove_representation( + tool.Ifc, + tool.Geometry, + obj=obj, + representation=old_representation, + ) + else: + representation_data["context"] = plan_annotation + plan_representation = ifcopenshell.api.run( + "geometry.add_door_representation", ifc_file, **representation_data + ) + tool.Model.replace_object_ifc_representation(plan_annotation, obj, plan_representation) + + if plan_body or plan_annotation: # adding switch representation at the end instead of changing order of representations # to prevent #2744 core.switch_representation( diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_door_representation.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_door_representation.py index 8da182abe9..b64ef827a1 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_door_representation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_door_representation.py @@ -236,8 +236,44 @@ class Usecase: # create 2d representation if self.settings["context"].TargetView == "PLAN_VIEW": items_2d = [] - door_items = [] + panel_size = V(panel_width, panel_depth) + if not sliding_door: + panel_position = V(lining_to_panel_offset_x, lining_depth) + else: + panel_position = V(lining_to_panel_offset_x, -panel_size.y) + if self.settings["context"].ContextIdentifier == "Annotation": + # only sliding door has annotation representation + if not sliding_door: + return None + + # arrow symbol + arrow_symbol = [] + arrow_offset = slider_arrow_symbol_size / cos(radians(15)) + arrow_symbol.append( + builder.polyline( + points=(V(0.35 * panel_size.x, 0), V(0.65 * panel_size.x, 0)), + ) + ) + arrow_symbol.append( + builder.polyline( + points=( + V(slider_arrow_symbol_size, arrow_offset), + V(0, 0), + V(slider_arrow_symbol_size, -arrow_offset), + ), + position_offset=V(0.35 * panel_size.x, 0), + ) + ) + + builder.translate(arrow_symbol, panel_position + V(0, -arrow_offset * 1.5)) + + items_2d.extend(arrow_symbol) + + representation_2d = builder.get_representation(self.settings["context"], items_2d, "Curve2D") + return representation_2d + + door_items = [] # create lining if l_shape_check([side_lining_thickness]): lining_points = [ @@ -302,30 +338,7 @@ class Usecase: door_items.append( builder.rectangle(size=handle_size.zz, position=V(panel_size.x * 0.1, -handle_size.z * 0.5)) ) - - # arrow symbol - arrow_symbol = [] - arrow_offset = slider_arrow_symbol_size / cos(radians(15)) - arrow_symbol.append( - builder.polyline( - points=(V(0.35 * panel_size.x, 0), V(0.65 * panel_size.x, 0)), - ) - ) - arrow_symbol.append( - builder.polyline( - points=( - V(slider_arrow_symbol_size, arrow_offset), - V(0, 0), - V(slider_arrow_symbol_size, -arrow_offset), - ), - position_offset=V(0.35 * panel_size.x, 0), - ) - ) - - builder.translate(arrow_symbol, panel_position + V(0, -arrow_offset * 1.5)) - builder.translate(door_items, panel_position - V(panel_size.x * 0.2, 0)) - door_items.extend(arrow_symbol) if door_swing_type == "RIGHT": mirror_point = panel_position + V(panel_size.x / 2, 0) @@ -333,12 +346,6 @@ class Usecase: return door_items door_items = [] - panel_size = V(panel_width, panel_depth) - if not sliding_door: - panel_position = V(lining_to_panel_offset_x, lining_depth) - else: - panel_position = V(lining_to_panel_offset_x, -panel_size.y) - if double_door: panel_size.x = panel_size.x / 2 door_items.extend(create_ifc_door_panel_2d(panel_size, panel_position, "LEFT", sliding_door)) diff --git a/src/ifcopenshell-python/ifcopenshell/util/shape_builder.py b/src/ifcopenshell-python/ifcopenshell/util/shape_builder.py index 3bbffbbe6a..162cf3248b 100644 --- a/src/ifcopenshell-python/ifcopenshell/util/shape_builder.py +++ b/src/ifcopenshell-python/ifcopenshell/util/shape_builder.py @@ -513,18 +513,19 @@ class ShapeBuilder: ) return extruded_area - def get_representation(self, context, items): + def get_representation(self, context, items, representation_type=None): # > items - could be a list or single curve/IfcExtrudedAreaSolid # < IfcShapeRepresentation if not isinstance(items, collections.abc.Iterable): items = [items] - if items[0].is_a("IfcExtrudedAreaSolid"): - representation_type = "SweptSolid" - elif items[0].is_a("IfcCurve") and items[0].Dim == 3: - representation_type = "Curve3D" - else: - representation_type = "Curve2D" + if not representation_type: + if items[0].is_a("IfcExtrudedAreaSolid"): + representation_type = "SweptSolid" + elif items[0].is_a("IfcCurve") and items[0].Dim == 3: + representation_type = "Curve3D" + else: + representation_type = "Curve2D" representation = self.file.createIfcShapeRepresentation( ContextOfItems=context,