diff --git a/src/bonsai/bonsai/bim/module/model/__init__.py b/src/bonsai/bonsai/bim/module/model/__init__.py index c6e76f132e..768b49196c 100644 --- a/src/bonsai/bonsai/bim/module/model/__init__.py +++ b/src/bonsai/bonsai/bim/module/model/__init__.py @@ -118,6 +118,7 @@ classes = ( mep.RegenerateDistributionElement, prop.SnapMousePoint, prop.PolylinePoint, + prop.PolylineMeasurement, prop.BIMModelProperties, prop.BIMArrayProperties, prop.BIMStairProperties, diff --git a/src/bonsai/bonsai/bim/module/model/decorator.py b/src/bonsai/bonsai/bim/module/model/decorator.py index 25ce4f856f..2465770f81 100644 --- a/src/bonsai/bonsai/bim/module/model/decorator.py +++ b/src/bonsai/bonsai/bim/module/model/decorator.py @@ -24,6 +24,7 @@ import bonsai.tool as tool from math import sin, cos, radians, degrees, atan2, acos from bpy.types import SpaceView3D import math +from bpy_extras import view3d_utils from mathutils import Vector, Matrix from gpu_extras.batch import batch_for_shader from typing import Union @@ -311,7 +312,8 @@ class PolylineDecorator: if cls.is_installed: cls.uninstall() handler = cls() - cls.handlers.append(SpaceView3D.draw_handler_add(handler.draw_text, (context,), "WINDOW", "POST_PIXEL")) + cls.handlers.append(SpaceView3D.draw_handler_add(handler.draw_input_panel, (context,), "WINDOW", "POST_PIXEL")) + cls.handlers.append(SpaceView3D.draw_handler_add(handler.draw_measurements, (context,), "WINDOW", "POST_PIXEL")) cls.handlers.append(SpaceView3D.draw_handler_add(handler, (context,), "WINDOW", "POST_VIEW")) cls.is_installed = True @@ -507,7 +509,7 @@ class PolylineDecorator: shader.uniform_float("color", color) batch.draw(shader) - def draw_text(self, context): + def draw_input_panel(self, context): texts = {"D": "Distance:", "A": "Angle:", "X": "X coord:", "Y": "Y coord:", "Z": "Z coord:", "AREA": "Area:"} self.addon_prefs = tool.Blender.get_addon_preferences() self.font_id = 0 @@ -525,9 +527,37 @@ class PolylineDecorator: blf.color(self.font_id, *color_highlight) else: blf.color(self.font_id, *color) - blf.position(self.font_id, self.mouse_pos[0] + offset, self.mouse_pos[1] + offset - (new_line * i), 0) + blf.position(self.font_id, self.mouse_pos[0] + offset, self.mouse_pos[1] - (new_line * i), 0) blf.draw(self.font_id, texts[key] + value) + def draw_measurements(self, context): + region = context.region + rv3d = region.data + measurement_prop = context.scene.BIMModelProperties.polyline_measurement + + + self.addon_prefs = tool.Blender.get_addon_preferences() + self.font_id = 0 + blf.size(self.font_id, 12) + blf.enable(self.font_id, blf.SHADOW) + blf.shadow(self.font_id, 6, 0, 0, 0, 1) + color = self.addon_prefs.decorations_colour + + + blf.color(self.font_id, *color) + for i in range(len(measurement_prop)): + if i == 0: + continue + pos_dim = (Vector(measurement_prop[i].position) + Vector(measurement_prop[i-1].position)) / 2 + coords_dim = view3d_utils.location_3d_to_region_2d(region, rv3d, pos_dim) + blf.position(self.font_id, coords_dim[0], coords_dim[1], 0) + blf.draw(self.font_id, "d: " + measurement_prop[i].dim) + + pos_angle = measurement_prop[i-1].position + coords_angle = view3d_utils.location_3d_to_region_2d(region, rv3d, pos_angle) + blf.position(self.font_id, coords_angle[0], coords_angle[1], 0) + blf.draw(self.font_id, "a: " + measurement_prop[i].angle) + def __call__(self, context): self.addon_prefs = tool.Blender.get_addon_preferences() diff --git a/src/bonsai/bonsai/bim/module/model/prop.py b/src/bonsai/bonsai/bim/module/model/prop.py index ac4bdb9b85..b02df5ec43 100644 --- a/src/bonsai/bonsai/bim/module/model/prop.py +++ b/src/bonsai/bonsai/bim/module/model/prop.py @@ -111,6 +111,10 @@ class PolylinePoint(PropertyGroup): y: bpy.props.FloatProperty(name="Y") z: bpy.props.FloatProperty(name="Z") +class PolylineMeasurement(PropertyGroup): + dim: bpy.props.StringProperty(name="Dimension") + angle: bpy.props.StringProperty(name="Angle") + position: bpy.props.FloatVectorProperty(name="Decorator Position", size=3) class BIMModelProperties(PropertyGroup): ifc_class: bpy.props.EnumProperty(items=get_ifc_class, name="Construction Class", update=update_ifc_class) @@ -206,6 +210,7 @@ class BIMModelProperties(PropertyGroup): snap_mouse_point: bpy.props.CollectionProperty(type=SnapMousePoint) snap_mouse_ref: bpy.props.CollectionProperty(type=SnapMousePoint) polyline_point: bpy.props.CollectionProperty(type=PolylinePoint) + polyline_measurement: bpy.props.CollectionProperty(type=PolylineMeasurement) class BIMArrayProperties(PropertyGroup): diff --git a/src/bonsai/bonsai/bim/module/project/operator.py b/src/bonsai/bonsai/bim/module/project/operator.py index 1731ee5dc9..00b1e83646 100644 --- a/src/bonsai/bonsai/bim/module/project/operator.py +++ b/src/bonsai/bonsai/bim/module/project/operator.py @@ -2311,7 +2311,7 @@ class MeasureTool(bpy.types.Operator): self.input_options = ["D", "A", "X", "Y", "Z"] self.input_type = "OFF" self.input_value_xy = [None, None] - self.input_panel = {"D": "", "A": "", "X": "", "Y": "", "Z": "", "AREA": ""} + self.input_panel = {"D": "", "A": "", "X": "", "Y": "", "Z": ""} self.snap_angle = None def recalculate_inputs(self, context): @@ -2354,7 +2354,6 @@ class MeasureTool(bpy.types.Operator): PolylineDecorator.set_mouse_position(event) self.input_panel = PolylineDecorator.calculate_distance_and_angle(context, self.is_input_on) PolylineDecorator.set_input_panel(self.input_panel, self.input_type) - self.input_panel = PolylineDecorator.calculate_area(context) tool.Blender.update_viewport() return {"RUNNING_MODAL"} @@ -2363,7 +2362,7 @@ class MeasureTool(bpy.types.Operator): tool.Blender.update_viewport() if event.value == "RELEASE" and event.type == "LEFTMOUSE": - tool.Snap.insert_polyline_point() + tool.Snap.insert_polyline_point(self.input_panel) tool.Blender.update_viewport() if event.value == "PRESS" and event.type == "C": @@ -2426,9 +2425,7 @@ class MeasureTool(bpy.types.Operator): if self.is_input_on and event.value == "RELEASE" and event.type in {"RET", "NUMPAD_ENTER", "RIGHTMOUSE"}: self.recalculate_inputs(context) - tool.Snap.insert_polyline_point( - float(self.input_panel["X"]), float(self.input_panel["Y"]), float(self.input_panel["Z"]) - ) + tool.Snap.insert_polyline_point(self.input_panel) self.is_input_on = False self.input_type = "OFF" self.number_input = [] diff --git a/src/bonsai/bonsai/tool/snap.py b/src/bonsai/bonsai/tool/snap.py index 71147de338..44ac7a8a34 100644 --- a/src/bonsai/bonsai/tool/snap.py +++ b/src/bonsai/bonsai/tool/snap.py @@ -117,7 +117,13 @@ class Snap(bonsai.core.tool.Snap): bpy.context.scene.BIMModelProperties.snap_mouse_ref.clear() @classmethod - def insert_polyline_point(cls, x=None, y=None, z=None): + def insert_polyline_point(cls, input_panel): + x = float(input_panel['X']) + y = float(input_panel['Y']) + z = float(input_panel['Z']) + d = input_panel['D'] + a = input_panel['A'] + snap_vertex = bpy.context.scene.BIMModelProperties.snap_mouse_point[0] if cls.use_default_container: z = tool.Ifc.get_object(tool.Root.get_default_container()).location.z @@ -139,6 +145,11 @@ class Snap(bonsai.core.tool.Snap): polyline_point.y = y polyline_point.z = z + polyline_measurement = bpy.context.scene.BIMModelProperties.polyline_measurement.add() + polyline_measurement.dim = d + polyline_measurement.angle = a + polyline_measurement.position = Vector((x, y, z)) + @classmethod def close_polyline(cls): polyline_data = bpy.context.scene.BIMModelProperties.polyline_point @@ -152,6 +163,7 @@ class Snap(bonsai.core.tool.Snap): @classmethod def clear_polyline(cls): bpy.context.scene.BIMModelProperties.polyline_point.clear() + bpy.context.scene.BIMModelProperties.polyline_measurement.clear() @classmethod def remove_last_polyline_point(cls):