diff --git a/src/blenderbim/blenderbim/bim/module/drawing/data.py b/src/blenderbim/blenderbim/bim/module/drawing/data.py index 3d0a65b48f..a57e843b82 100644 --- a/src/blenderbim/blenderbim/bim/module/drawing/data.py +++ b/src/blenderbim/blenderbim/bim/module/drawing/data.py @@ -123,6 +123,8 @@ class DrawingsData: [(str(s.id()), s.Name or "Unnamed", "") for s in tool.Ifc.get().by_type("IfcBuildingStorey")] ) return results + elif bpy.context.scene.DocProperties.target_view in ["MODEL_VIEW"]: + return [(h.upper(), h, "") for h in ["Orthographic", "Perspective"]] return [(h.upper(), h, "") for h in ["North", "South", "East", "West"]] @classmethod diff --git a/src/blenderbim/blenderbim/core/drawing.py b/src/blenderbim/blenderbim/core/drawing.py index 683f7350d0..3febd51e20 100644 --- a/src/blenderbim/blenderbim/core/drawing.py +++ b/src/blenderbim/blenderbim/core/drawing.py @@ -190,7 +190,7 @@ def disable_editing_drawings(drawing): def add_drawing(ifc, collector, drawing, target_view=None, location_hint=None): drawing_name = drawing.ensure_unique_drawing_name(drawing.generate_drawing_name(target_view, location_hint)) drawing_matrix = drawing.generate_drawing_matrix(target_view, location_hint) - camera = drawing.create_camera(drawing_name, drawing_matrix) + camera = drawing.create_camera(drawing_name, drawing_matrix, location_hint) element = drawing.run_root_assign_class( obj=camera, ifc_class="IfcAnnotation", diff --git a/src/blenderbim/blenderbim/core/tool.py b/src/blenderbim/blenderbim/core/tool.py index afa3a6810c..756f2a4192 100644 --- a/src/blenderbim/blenderbim/core/tool.py +++ b/src/blenderbim/blenderbim/core/tool.py @@ -253,7 +253,7 @@ class Drawing: def copy_representation(cls, source, dest): pass def create_annotation_context(cls, target_view, object_type=None): pass def create_annotation_object(cls, drawing, object_type): pass - def create_camera(cls, name, matrix): pass + def create_camera(cls, name, matrix, location_hint): pass def create_svg_schedule(cls, schedule): pass def create_svg_sheet(cls, document, titleblock): pass def delete_collection(cls, collection): pass diff --git a/src/blenderbim/blenderbim/tool/drawing.py b/src/blenderbim/blenderbim/tool/drawing.py index ae75535699..7a88fe2c86 100644 --- a/src/blenderbim/blenderbim/tool/drawing.py +++ b/src/blenderbim/blenderbim/tool/drawing.py @@ -205,11 +205,14 @@ class Drawing(blenderbim.core.tool.Drawing): return rep @classmethod - def create_camera(cls, name, matrix): + def create_camera(cls, name, matrix, location_hint): camera = bpy.data.objects.new(name, bpy.data.cameras.new(name)) camera.location = (0, 0, 1.5) # The view shall be 1.5m above the origin camera.data.show_limits = True - camera.data.type = "ORTHO" + if location_hint == "PERSPECTIVE": + camera.data.type = "PERSP" + else: + camera.data.type = "ORTHO" camera.data.ortho_scale = 50 # The default of 6m is too small camera.data.clip_start = 0.002 # 2mm is close to zero but allows any GPU-drawn lines to be visible. camera.data.clip_end = 10 # A slightly more reasonable default @@ -487,6 +490,8 @@ class Drawing(blenderbim.core.tool.Drawing): return mathutils.Matrix(((0, 0, -1, x), (-1, 0, 0, y), (0, 1, 0, z), (0, 0, 0, 1))) elif location_hint == "WEST": return mathutils.Matrix(((0, 0, 1, x), (1, 0, 0, y), (0, 1, 0, z), (0, 0, 0, 1))) + elif target_view == "MODEL_VIEW": + return mathutils.Matrix(((1, 0, 0, x), (0, 1, 0, y), (0, 0, 1, z), (0, 0, 0, 1))) return mathutils.Matrix() @classmethod @@ -954,6 +959,8 @@ class Drawing(blenderbim.core.tool.Drawing): return (location.Name or "UNNAMED").upper() + " " + target_view.split("_")[0] elif target_view in ("SECTION_VIEW", "ELEVATION_VIEW") and location_hint: return location_hint + " " + target_view.split("_")[0] + elif target_view == "MODEL_VIEW" and location_hint: + return location_hint return target_view @classmethod diff --git a/src/blenderbim/test/core/test_drawing.py b/src/blenderbim/test/core/test_drawing.py index cb5e76f248..f2759fc3d2 100644 --- a/src/blenderbim/test/core/test_drawing.py +++ b/src/blenderbim/test/core/test_drawing.py @@ -311,7 +311,7 @@ class TestAddDrawing: drawing.generate_drawing_name("target_view", "location_hint").should_be_called().will_return("drawing_name") drawing.ensure_unique_drawing_name("drawing_name").should_be_called().will_return("name") drawing.generate_drawing_matrix("target_view", "location_hint").should_be_called().will_return("matrix") - drawing.create_camera("name", "matrix").should_be_called().will_return("obj") + drawing.create_camera("name", "matrix", "location_hint").should_be_called().will_return("obj") drawing.get_body_context().should_be_called().will_return("context") drawing.run_root_assign_class( obj="obj",