diff --git a/src/blenderbim/blenderbim/bim/data/styles/default.css b/src/blenderbim/blenderbim/bim/data/styles/default.css index 2f7601f990..e87a177590 100644 --- a/src/blenderbim/blenderbim/bim/data/styles/default.css +++ b/src/blenderbim/blenderbim/bim/data/styles/default.css @@ -35,7 +35,7 @@ text { fill: black; stroke: none; } .PredefinedType-RADIUS { marker-end: url(#radius-marker-end); } .PredefinedType-DIAMETER { marker-start: url(#diameter-marker-start); marker-end: url(#diameter-marker-end); } .PredefinedType-HIDDENLINE { stroke-dasharray: 3, 2; } -.PredefinedType-STAIR { marker-start: url(#stair-marker-start); marker-end: url(#stair-marker-end); } +.PredefinedType-STAIRARROW { marker-start: url(#stair-marker-start); marker-end: url(#stair-marker-end); } .PredefinedType-BOUNDARY { fill: none; stroke: red; stroke-width: 1; stroke-dasharray: 12, 4, 3, 4, 3, 4; } .PredefinedType-BATTING { marker-start: url(#batting); stroke: none; } .PredefinedType-SEALANT { fill: url(#crosshatch1); stroke-width: 0.25; } diff --git a/src/blenderbim/blenderbim/bim/module/drawing/annotation.py b/src/blenderbim/blenderbim/bim/module/drawing/annotation.py index 7401b4eccb..aeb5903b0c 100644 --- a/src/blenderbim/blenderbim/bim/module/drawing/annotation.py +++ b/src/blenderbim/blenderbim/bim/module/drawing/annotation.py @@ -151,10 +151,17 @@ class Annotator: return obj @staticmethod - def get_annotation_obj(object_type, data_type): - collection = bpy.context.scene.camera.users_collection[0] + def get_annotation_obj(drawing, object_type, data_type): + camera = tool.Ifc.get_object(drawing) + co1, _, _, _ = Annotator.get_placeholder_coords(camera) + matrix_world = camera.matrix_world.copy() + matrix_world[0][3] = co1.x + matrix_world[1][3] = co1.y + matrix_world[2][3] = co1.z + collection = camera.users_collection[0] if object_type == "TEXT": obj = bpy.data.objects.new(object_type, None) + obj.matrix_world = matrix_world collection.objects.link(obj) return obj elif object_type in ("TEXT_LEADER", "SECTION_LEVEL"): @@ -162,6 +169,7 @@ class Annotator: data.dimensions = "3D" data.resolution_u = 2 obj = bpy.data.objects.new(object_type, data) + obj.matrix_world = matrix_world collection.objects.link(obj) return obj if object_type != "ANGLE": @@ -176,12 +184,14 @@ class Annotator: data.dimensions = "3D" data.resolution_u = 2 obj = bpy.data.objects.new(object_type, data) + obj.matrix_world = matrix_world collection.objects.link(obj) return obj @staticmethod - def get_placeholder_coords(): - camera = bpy.context.scene.camera + def get_placeholder_coords(camera=None): + if not camera: + camera = bpy.context.scene.camera z_offset = camera.matrix_world.to_quaternion() @ Vector((0, 0, -1)) if bpy.context.scene.render.resolution_x > bpy.context.scene.render.resolution_y: y = ( diff --git a/src/blenderbim/blenderbim/bim/module/material/data.py b/src/blenderbim/blenderbim/bim/module/material/data.py index 3f5245fc13..4d90a29408 100644 --- a/src/blenderbim/blenderbim/bim/module/material/data.py +++ b/src/blenderbim/blenderbim/bim/module/material/data.py @@ -90,7 +90,7 @@ class ObjectMaterialData: def type_material(cls): element = tool.Ifc.get_entity(bpy.context.active_object) element_type = ifcopenshell.util.element.get_type(element) - if element_type != element: + if element_type and element_type != element: material = ifcopenshell.util.element.get_material(element_type) if not material: return diff --git a/src/blenderbim/blenderbim/core/drawing.py b/src/blenderbim/blenderbim/core/drawing.py index fe82d49ade..6bad766d63 100644 --- a/src/blenderbim/blenderbim/core/drawing.py +++ b/src/blenderbim/blenderbim/core/drawing.py @@ -192,7 +192,7 @@ def add_annotation(ifc, collector, drawing_tool, drawing=None, object_type=None) if not context: return drawing_tool.show_decorations() - obj = drawing_tool.create_annotation_object(object_type) + obj = drawing_tool.create_annotation_object(drawing, object_type) element = ifc.get_entity(obj) if not element: element = drawing_tool.run_root_assign_class( diff --git a/src/blenderbim/blenderbim/core/tool.py b/src/blenderbim/blenderbim/core/tool.py index bfc273fc10..6e478fb359 100644 --- a/src/blenderbim/blenderbim/core/tool.py +++ b/src/blenderbim/blenderbim/core/tool.py @@ -154,7 +154,7 @@ class Document: @interface class Drawing: - def create_annotation_object(cls, object_type): pass + def create_annotation_object(cls, drawing, object_type): pass def create_camera(cls, name, matrix): pass def create_svg_schedule(cls, schedule): pass def create_svg_sheet(cls, document, titleblock): pass diff --git a/src/blenderbim/blenderbim/tool/drawing.py b/src/blenderbim/blenderbim/tool/drawing.py index a0099e9ccb..34d9a153bf 100644 --- a/src/blenderbim/blenderbim/tool/drawing.py +++ b/src/blenderbim/blenderbim/tool/drawing.py @@ -36,7 +36,7 @@ import blenderbim.bim.module.drawing.helper as helper class Drawing(blenderbim.core.tool.Drawing): @classmethod - def create_annotation_object(cls, object_type): + def create_annotation_object(cls, drawing, object_type): data_type = { "ANGLE": "mesh", "BREAKLINE": "mesh", @@ -52,7 +52,7 @@ class Drawing(blenderbim.core.tool.Drawing): "TEXT": "empty", "TEXT_LEADER": "curve", }[object_type] - obj = annotation.Annotator.get_annotation_obj(object_type, data_type) + obj = annotation.Annotator.get_annotation_obj(drawing, object_type, data_type) if object_type == "FILL_AREA": obj = annotation.Annotator.add_plane_to_annotation(obj) elif object_type != "TEXT": diff --git a/src/blenderbim/test/core/test_drawing.py b/src/blenderbim/test/core/test_drawing.py index 290c4f8ca3..3746379740 100644 --- a/src/blenderbim/test/core/test_drawing.py +++ b/src/blenderbim/test/core/test_drawing.py @@ -281,7 +281,7 @@ class TestAddAnnotation: drawing.show_decorations().should_be_called() drawing.get_drawing_target_view("drawing").should_be_called().will_return("target_view") drawing.get_annotation_context("target_view").should_be_called().will_return("context") - drawing.create_annotation_object("object_type").should_be_called().will_return("obj") + drawing.create_annotation_object("drawing", "object_type").should_be_called().will_return("obj") ifc.get_entity("obj").should_be_called().will_return(None) drawing.get_ifc_representation_class("object_type").should_be_called().will_return("ifc_representation_class") drawing.run_root_assign_class(