diff --git a/src/blenderbim/blenderbim/bim/module/drawing/operator.py b/src/blenderbim/blenderbim/bim/module/drawing/operator.py index 41f1c5568d..d2bf5aca24 100644 --- a/src/blenderbim/blenderbim/bim/module/drawing/operator.py +++ b/src/blenderbim/blenderbim/bim/module/drawing/operator.py @@ -1515,7 +1515,14 @@ class ActivateDrawing(bpy.types.Operator): if not self.camera_view_point: viewport_position = tool.Blender.get_viewport_position() - core.activate_drawing_view(tool.Ifc, tool.Drawing, drawing=drawing) + try: + core.activate_drawing_view(tool.Ifc, tool.Blender, tool.Drawing, drawing=drawing) + except core.CameraNotAvailableError: + self.report( + {"ERROR"}, + "The drawing view is not available. Ensure you have not excluded it in the active view layer.", + ) + return {"CANCELLED"} if not self.camera_view_point: tool.Blender.set_viewport_position(viewport_position) diff --git a/src/blenderbim/blenderbim/core/drawing.py b/src/blenderbim/blenderbim/core/drawing.py index d4f6adab9b..f52fc2e1c5 100644 --- a/src/blenderbim/blenderbim/core/drawing.py +++ b/src/blenderbim/blenderbim/core/drawing.py @@ -441,9 +441,19 @@ def select_assigned_product(drawing, context): drawing.select_assigned_product(context) -def activate_drawing_view(ifc, drawing_tool, drawing): +def activate_drawing_view(ifc, blender, drawing_tool, drawing): camera = ifc.get_object(drawing) if not camera: camera = drawing_tool.import_drawing(drawing) drawing_tool.import_annotations_in_group(drawing_tool.get_drawing_group(drawing)) + blender.activate_camera(camera) + drawing_tool.isolate_camera_collection(camera) + try: + blender.set_active_object(camera) + except: + raise CameraNotAvailableError() drawing_tool.activate_drawing(camera) + + +class CameraNotAvailableError(Exception): + pass diff --git a/src/blenderbim/blenderbim/core/tool.py b/src/blenderbim/blenderbim/core/tool.py index d832bae89b..186ca93001 100644 --- a/src/blenderbim/blenderbim/core/tool.py +++ b/src/blenderbim/blenderbim/core/tool.py @@ -18,6 +18,7 @@ import abc import inspect +from typing import Optional # fmt: off # pylint: skip-file @@ -72,20 +73,21 @@ class Aggregate: @interface class Blender: - def set_active_object(cls, obj): pass - def get_name(cls, ifc_class, name): pass - def get_selected_objects(cls): pass - def create_ifc_object(cls, ifc_class: str, name: str = None, data=None): pass - def get_obj_ifc_definition_id(cls, obj=None, obj_type=None, context=None): pass - def is_ifc_object(cls, obj): pass - def is_ifc_class_active(cls, ifc_class): pass - def get_viewport_context(cls): pass - def update_viewport(cls): pass - def get_default_selection_keypmap(cls): pass - def get_object_bounding_box(cls, obj): pass + def activate_camera(cls, obj): pass def apply_bmesh(cls, mesh, bm, obj=None): pass - def get_bmesh_for_mesh(cls, mesh, clean=False): pass def bmesh_join(cls, bm_a, bm_b, callback=None): pass + def create_ifc_object(cls, ifc_class: str, name: Optional[str] = None, data=None): pass + def get_bmesh_for_mesh(cls, mesh, clean=False): pass + def get_default_selection_keypmap(cls): pass + def get_name(cls, ifc_class, name): pass + def get_obj_ifc_definition_id(cls, obj=None, obj_type=None, context=None): pass + def get_object_bounding_box(cls, obj): pass + def get_selected_objects(cls): pass + def get_viewport_context(cls): pass + def is_ifc_class_active(cls, ifc_class): pass + def is_ifc_object(cls, obj): pass + def set_active_object(cls, obj): pass + def update_viewport(cls): pass @interface diff --git a/src/blenderbim/blenderbim/tool/blender.py b/src/blenderbim/blenderbim/tool/blender.py index 63bec8569f..d5055bf9bf 100644 --- a/src/blenderbim/blenderbim/tool/blender.py +++ b/src/blenderbim/blenderbim/tool/blender.py @@ -49,6 +49,23 @@ class Blender(blenderbim.core.tool.Blender): OBJECT_TYPES_THAT_SUPPORT_EDIT_GPENCIL_MODE = ("GPENCIL",) TYPE_MANAGER_ICON = "LIGHTPROBE_VOLUME" if bpy.app.version >= (4, 1, 0) else "LIGHTPROBE_GRID" + @classmethod + def activate_camera(cls, obj: bpy.types.Object) -> None: + area = tool.Blender.get_view3d_area() + is_local_view = area.spaces[0].local_view is not None + if is_local_view: + # Turn off local view before activating drawing, and then turn it on again. + for a in bpy.context.screen.areas: + if a.type == "VIEW_3D": + override = bpy.context.copy() + override["area"] = a + bpy.ops.view3d.localview(override) + bpy.context.scene.camera = obj + bpy.ops.view3d.localview(override) + else: + bpy.context.scene.camera = obj + area.spaces[0].region_3d.view_perspective = "CAMERA" + @classmethod def get_area_props(cls, context: bpy.types.Context) -> Any: try: @@ -845,9 +862,7 @@ class Blender(blenderbim.core.tool.Blender): bpy.utils.register_tool(ws_model.PipeTool, after={"bim.duct_tool"}, separator=False, group=False) bpy.utils.register_tool(ws_model.BimTool, after={"bim.pipe_tool"}, separator=False, group=False) bpy.utils.register_tool(ws_drawing.AnnotationTool, after={"bim.bim_tool"}, separator=True, group=False) - bpy.utils.register_tool( - ws_spatial.SpatialTool, after={"bim.annotation_tool"}, separator=False, group=False - ) + bpy.utils.register_tool(ws_spatial.SpatialTool, after={"bim.annotation_tool"}, separator=False, group=False) bpy.utils.register_tool( ws_structural.StructuralTool, after={"bim.spatial_tool"}, separator=False, group=False ) diff --git a/src/blenderbim/blenderbim/tool/drawing.py b/src/blenderbim/blenderbim/tool/drawing.py index 7cdb5adfbd..0d38dc2fe7 100644 --- a/src/blenderbim/blenderbim/tool/drawing.py +++ b/src/blenderbim/blenderbim/tool/drawing.py @@ -1743,21 +1743,7 @@ class Drawing(blenderbim.core.tool.Drawing): bpy.ops.bim.activate_model() @classmethod - def activate_drawing(cls, camera: bpy.types.Object) -> None: - area = tool.Blender.get_view3d_area() - is_local_view = area.spaces[0].local_view is not None - if is_local_view: - # turn off local view before activating drawing, and then turn it on again. - for a in bpy.context.screen.areas: - if a.type == "VIEW_3D": - override = bpy.context.copy() - override["area"] = a - bpy.ops.view3d.localview(override) - bpy.context.scene.camera = camera - bpy.ops.view3d.localview(override) - else: - bpy.context.scene.camera = camera - area.spaces[0].region_3d.view_perspective = "CAMERA" + def isolate_camera_collection(cls, camera: bpy.types.Object) -> None: views_collection = bpy.data.collections.get("Views") for collection in views_collection.children: # We assume the project collection is at the top level @@ -1775,8 +1761,9 @@ class Drawing(blenderbim.core.tool.Drawing): camera.BIMObjectProperties.collection.name ].hide_viewport = False camera.BIMObjectProperties.collection.hide_render = False - tool.Spatial.set_active_object(camera) + @classmethod + def activate_drawing(cls, camera: bpy.types.Object) -> None: # Sync viewport objects visibility with selectors from EPset_Drawing/Include and /Exclude drawing = tool.Ifc.get_entity(camera)