diff --git a/src/ifcblenderexport/blenderbim/bim/.gitignore b/src/ifcblenderexport/blenderbim/bim/.gitignore new file mode 100644 index 0000000000..4b1304fd48 --- /dev/null +++ b/src/ifcblenderexport/blenderbim/bim/.gitignore @@ -0,0 +1,2 @@ +# addon writes tmp stuff directly to its dir +/data/ \ No newline at end of file diff --git a/src/ifcblenderexport/blenderbim/bim/decoration.py b/src/ifcblenderexport/blenderbim/bim/decoration.py new file mode 100644 index 0000000000..9457e495c8 --- /dev/null +++ b/src/ifcblenderexport/blenderbim/bim/decoration.py @@ -0,0 +1,47 @@ +"""Viewport decorations""" +from bpy.types import SpaceView3D +import bpy +import blf + + +class ViewDecorator(object): + # class var for single handler + installed = None + + @classmethod + def install(cls, *args, **kwargs): + handler = cls(*args, **kwargs) + cls.installed = SpaceView3D.draw_handler_add(handler, (), 'WINDOW', 'POST_PIXEL') + + @classmethod + def uninstall(cls): + SpaceView3D.draw_handler_remove(cls.installed, 'WINDOW') + cls.installed = None + + +class DimensionDecorator(ViewDecorator): + """Decorates dimension curves + - outlines each segment with an arrow + - puts metric text next to each segment + """ + + def __init__(self, scene, context): + self.scene = scene + self.context = context + self.font_id = 0 + self.dpi = context.preferences.system.dpi + print("Created decorator", scene) + + def __call__(self): + # get active drawing, if any + if self.scene.active_drawing_index is None or len(self.scene.drawings) == 0: + return + drawing = self.scene.drawings[self.scene.active_drawing_index] + collection = bpy.data.collections.get("IfcGroup/" + drawing.name) + if 'IfcAnnotation/Dimension' not in collection.all_objects: + return + curve = collection.all_objects['IfcAnnotation/Dimension'].data + text = repr(curve) + blf.position(self.font_id, 100, 100, 0) + blf.size(self.font_id, 10, self.dpi) + blf.draw(self.font_id, text) diff --git a/src/ifcblenderexport/blenderbim/bim/prop.py b/src/ifcblenderexport/blenderbim/bim/prop.py index 2d08aceda3..6985fa0fa8 100644 --- a/src/ifcblenderexport/blenderbim/bim/prop.py +++ b/src/ifcblenderexport/blenderbim/bim/prop.py @@ -8,6 +8,7 @@ from . import schema from . import bcf from . import ifc from . import annotation +from . import decoration import bpy from bpy.types import PropertyGroup from bpy.app.handlers import persistent @@ -357,6 +358,14 @@ def refreshTitleblocks(self, context): getTitleblocks(self, context) +def toggleDimDecorations(self, context): + toggle = self.dim_decorations + if toggle: + decoration.DimensionDecorator.install(self, context) + else: + decoration.DimensionDecorator.uninstall() + + def getScenarios(self, context): global scenarios_enum if len(scenarios_enum) < 1: @@ -668,6 +677,7 @@ class DocProperties(PropertyGroup): active_sheet_index: IntProperty(name="Active Sheet Index") ifc_files: CollectionProperty(name="IFCs", type=StrProperty) drawing_styles: CollectionProperty(name="Drawing Styles", type=DrawingStyle) + dim_decorations: BoolProperty(name="Decorate dimentions", update=toggleDimDecorations) class BIMCameraProperties(PropertyGroup): diff --git a/src/ifcblenderexport/blenderbim/bim/ui.py b/src/ifcblenderexport/blenderbim/bim/ui.py index 8a5b86c016..08b4f36d2d 100644 --- a/src/ifcblenderexport/blenderbim/bim/ui.py +++ b/src/ifcblenderexport/blenderbim/bim/ui.py @@ -2352,6 +2352,9 @@ class BIM_PT_annotation_utilities(Panel): row.operator("bim.remove_drawing", icon="X", text="").index = props.active_drawing_index layout.template_list("BIM_UL_generic", "", props, "drawings", props, "active_drawing_index") + row = layout.row() + row.prop(props, 'dim_decorations') + class BIM_PT_qto_utilities(Panel): bl_idname = "BIM_PT_qto_utilities" @@ -2396,7 +2399,7 @@ class BIM_PT_clash_manager(Panel): row = layout.row() layout.label(text="Select output path for smart-grouped clashes:") - + row = layout.row(align=True) row.prop(props, "smart_grouped_clashes_path", text="") op = row.operator("bim.select_smart_grouped_clashes_path", icon="FILE_FOLDER", text="") @@ -2409,7 +2412,7 @@ class BIM_PT_clash_manager(Panel): row = layout.row(align=True) row.operator("bim.load_smart_groups_for_active_clash_set") - + layout.template_list('BIM_UL_smart_groups', '', props, 'smart_clash_groups', props, 'active_smart_group_index') row = layout.row(align=True)