From b61d8709225cfb3020fc40731dec7696ddec34bb Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Wed, 10 Apr 2024 10:36:51 +1000 Subject: [PATCH] See #4481. Defer setting render visibility to drawing generation to speed up switching between drawings. Doing obj.hide_render = True/False in a loop is slow and there is no bulk set command. --- .../blenderbim/bim/module/drawing/operator.py | 5 ++++ src/blenderbim/blenderbim/tool/drawing.py | 28 ++++++------------- 2 files changed, 14 insertions(+), 19 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/drawing/operator.py b/src/blenderbim/blenderbim/bim/module/drawing/operator.py index 6d02ca5aa2..9a275e5018 100644 --- a/src/blenderbim/blenderbim/bim/module/drawing/operator.py +++ b/src/blenderbim/blenderbim/bim/module/drawing/operator.py @@ -341,6 +341,11 @@ class CreateDrawing(bpy.types.Operator): if not ifcopenshell.util.element.get_pset(self.drawing, "EPset_Drawing", "HasUnderlay"): return svg_path = self.get_svg_path(cache_type="underlay") + + visible_object_names = {obj.name for obj in bpy.context.visible_objects} + for obj in bpy.context.view_layer.objects: + obj.hide_render = obj.name not in visible_object_names + context.scene.render.filepath = svg_path[0:-4] + ".png" drawing_style = context.scene.DocProperties.drawing_styles[self.cprops.active_drawing_style_index] diff --git a/src/blenderbim/blenderbim/tool/drawing.py b/src/blenderbim/blenderbim/tool/drawing.py index 6d91dd2459..a14a2f7337 100644 --- a/src/blenderbim/blenderbim/tool/drawing.py +++ b/src/blenderbim/blenderbim/tool/drawing.py @@ -1716,20 +1716,6 @@ class Drawing(blenderbim.core.tool.Drawing): filtered_elements = cls.get_drawing_elements(drawing) | cls.get_drawing_spaces(drawing) filtered_elements.add(drawing) - # Hide everything first, then selectively show. This is significantly faster. - with bpy.context.temp_override(area=next(a for a in bpy.context.screen.areas if a.type == "VIEW_3D")): - bpy.ops.object.hide_view_set(unselected=False) - bpy.ops.object.hide_view_set(unselected=True) - - for view_layer_object in bpy.context.view_layer.objects: - element = tool.Ifc.get_entity(view_layer_object) - if not element or element.is_a("IfcTypeProduct"): - continue - if element in filtered_elements: - view_layer_object.hide_set(False) - view_layer_object.hide_render = False - elif view_layer_object.hide_render is not True: - view_layer_object.hide_render = True subcontexts: list[ifcopenshell.entity_instance] = [] target_view = cls.get_drawing_target_view(drawing) @@ -1764,6 +1750,11 @@ class Drawing(blenderbim.core.tool.Drawing): if subcontext: subcontexts.append(context_filter) + # Hide everything first, then selectively show. This is significantly faster. + with bpy.context.temp_override(area=next(a for a in bpy.context.screen.areas if a.type == "VIEW_3D")): + bpy.ops.object.hide_view_set(unselected=False) + bpy.ops.object.hide_view_set(unselected=True) + # switch representations and hide elements without representations for element in filtered_elements: obj = tool.Ifc.get_object(element) @@ -1793,11 +1784,10 @@ class Drawing(blenderbim.core.tool.Drawing): has_context = True break - # don't hide IfcAnnotations as some of them might exist without representations - # e.g. with ObjectType = SYMBOL - if not has_context and not element.is_a("IfcAnnotation"): - obj.hide_set(True) - obj.hide_render = True + # Don't hide IfcAnnotations as some of them might exist without representations + if has_context or element.is_a("IfcAnnotation"): + # Note that render visibility is only set on drawing generation time for speed. + obj.hide_set(False) @classmethod def get_elements_in_camera_view(