mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-12 14:33:28 +00:00
Fix #4647. Better error reporting if the user tries to activate a drawing that isn't available.
This commit is contained in:
@@ -1515,7 +1515,14 @@ class ActivateDrawing(bpy.types.Operator):
|
|||||||
if not self.camera_view_point:
|
if not self.camera_view_point:
|
||||||
viewport_position = tool.Blender.get_viewport_position()
|
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:
|
if not self.camera_view_point:
|
||||||
tool.Blender.set_viewport_position(viewport_position)
|
tool.Blender.set_viewport_position(viewport_position)
|
||||||
|
|||||||
@@ -441,9 +441,19 @@ def select_assigned_product(drawing, context):
|
|||||||
drawing.select_assigned_product(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)
|
camera = ifc.get_object(drawing)
|
||||||
if not camera:
|
if not camera:
|
||||||
camera = drawing_tool.import_drawing(drawing)
|
camera = drawing_tool.import_drawing(drawing)
|
||||||
drawing_tool.import_annotations_in_group(drawing_tool.get_drawing_group(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)
|
drawing_tool.activate_drawing(camera)
|
||||||
|
|
||||||
|
|
||||||
|
class CameraNotAvailableError(Exception):
|
||||||
|
pass
|
||||||
|
|||||||
@@ -18,6 +18,7 @@
|
|||||||
|
|
||||||
import abc
|
import abc
|
||||||
import inspect
|
import inspect
|
||||||
|
from typing import Optional
|
||||||
|
|
||||||
# fmt: off
|
# fmt: off
|
||||||
# pylint: skip-file
|
# pylint: skip-file
|
||||||
@@ -72,20 +73,21 @@ class Aggregate:
|
|||||||
|
|
||||||
@interface
|
@interface
|
||||||
class Blender:
|
class Blender:
|
||||||
def set_active_object(cls, obj): pass
|
def activate_camera(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 apply_bmesh(cls, mesh, bm, obj=None): 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 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
|
@interface
|
||||||
|
|||||||
@@ -49,6 +49,23 @@ class Blender(blenderbim.core.tool.Blender):
|
|||||||
OBJECT_TYPES_THAT_SUPPORT_EDIT_GPENCIL_MODE = ("GPENCIL",)
|
OBJECT_TYPES_THAT_SUPPORT_EDIT_GPENCIL_MODE = ("GPENCIL",)
|
||||||
TYPE_MANAGER_ICON = "LIGHTPROBE_VOLUME" if bpy.app.version >= (4, 1, 0) else "LIGHTPROBE_GRID"
|
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
|
@classmethod
|
||||||
def get_area_props(cls, context: bpy.types.Context) -> Any:
|
def get_area_props(cls, context: bpy.types.Context) -> Any:
|
||||||
try:
|
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.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_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_drawing.AnnotationTool, after={"bim.bim_tool"}, separator=True, group=False)
|
||||||
bpy.utils.register_tool(
|
bpy.utils.register_tool(ws_spatial.SpatialTool, after={"bim.annotation_tool"}, separator=False, group=False)
|
||||||
ws_spatial.SpatialTool, after={"bim.annotation_tool"}, separator=False, group=False
|
|
||||||
)
|
|
||||||
bpy.utils.register_tool(
|
bpy.utils.register_tool(
|
||||||
ws_structural.StructuralTool, after={"bim.spatial_tool"}, separator=False, group=False
|
ws_structural.StructuralTool, after={"bim.spatial_tool"}, separator=False, group=False
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1743,21 +1743,7 @@ class Drawing(blenderbim.core.tool.Drawing):
|
|||||||
bpy.ops.bim.activate_model()
|
bpy.ops.bim.activate_model()
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def activate_drawing(cls, camera: bpy.types.Object) -> None:
|
def isolate_camera_collection(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"
|
|
||||||
views_collection = bpy.data.collections.get("Views")
|
views_collection = bpy.data.collections.get("Views")
|
||||||
for collection in views_collection.children:
|
for collection in views_collection.children:
|
||||||
# We assume the project collection is at the top level
|
# We assume the project collection is at the top level
|
||||||
@@ -1775,8 +1761,9 @@ class Drawing(blenderbim.core.tool.Drawing):
|
|||||||
camera.BIMObjectProperties.collection.name
|
camera.BIMObjectProperties.collection.name
|
||||||
].hide_viewport = False
|
].hide_viewport = False
|
||||||
camera.BIMObjectProperties.collection.hide_render = 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
|
# Sync viewport objects visibility with selectors from EPset_Drawing/Include and /Exclude
|
||||||
drawing = tool.Ifc.get_entity(camera)
|
drawing = tool.Ifc.get_entity(camera)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user