From 50c1220730ba689deb893559e792f76df8e8c2d8 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Mon, 7 Apr 2025 14:34:58 +0500 Subject: [PATCH] typing --- .../bonsai/bim/module/model/decorator.py | 26 +++++++++++++------ .../bonsai/bim/module/model/polyline.py | 2 ++ src/bonsai/bonsai/tool/raycast.py | 14 +++++++--- src/bonsai/bonsai/tool/snap.py | 22 ++++++++++------ 4 files changed, 44 insertions(+), 20 deletions(-) diff --git a/src/bonsai/bonsai/bim/module/model/decorator.py b/src/bonsai/bonsai/bim/module/model/decorator.py index 003a701bbe..b619bb422f 100644 --- a/src/bonsai/bonsai/bim/module/model/decorator.py +++ b/src/bonsai/bonsai/bim/module/model/decorator.py @@ -16,6 +16,7 @@ # You should have received a copy of the GNU General Public License # along with Bonsai. If not, see . +from __future__ import annotations import bpy import blf import bpy @@ -34,6 +35,7 @@ from gpu_extras.presets import draw_circle_2d from typing import Union from bonsai.bim.module.drawing.helper import format_distance from itertools import chain +from typing import Union, Any def transparent_color(color, alpha=0.1): @@ -348,21 +350,28 @@ class PolylineDecorator: cls.is_installed = False @classmethod - def update(cls, event, tool_state, input_ui, snapping_point): + def update( + cls, + event: bpy.types.Event, + tool_state: tool.Polyline.ToolState, + input_ui: tool.Polyline.PolylineUI, + snapping_point: Vector, + ) -> None: cls.event = event cls.tool_state = tool_state cls.input_ui = input_ui + # TODO: unused? @classmethod - def set_input_ui(cls, input_ui): + def set_input_ui(cls, input_ui: tool.Polyline.PolylineUI) -> None: cls.input_ui = input_ui @classmethod - def set_angle_axis_line(cls, start, end): + def set_angle_axis_line(cls, start: Vector, end: Vector) -> None: cls.axis_start = start cls.axis_end = end - def calculate_measurement_x_y_and_z(self, context): + def calculate_measurement_x_y_and_z(self, context: bpy.types.Context) -> None: polyline_data = context.scene.BIMPolylineProperties.insertion_polyline polyline_points = polyline_data[0].polyline_points if polyline_data else [] @@ -385,7 +394,7 @@ class PolylineDecorator: return (x_axis, y_axis, z_axis), (x_middle, y_middle, z_middle) @classmethod - def calculate_polygon(self, points): + def calculate_polygon(cls, points: list[Vector]) -> dict[str, Any]: bm = bmesh.new() new_verts = [bm.verts.new(v) for v in points] @@ -414,7 +423,7 @@ class PolylineDecorator: shader.uniform_float("color", color) batch.draw(shader) - def draw_input_ui(self, context): + def draw_input_ui(self, context: bpy.types.Context) -> None: texts = { "D": "Distance: ", "A": "Angle: ", @@ -424,6 +433,7 @@ class PolylineDecorator: "AREA": "Area:", } try: + assert self.event mouse_pos = self.event.mouse_region_x, self.event.mouse_region_y except: mouse_pos = (None, None) @@ -726,8 +736,8 @@ class PolylineDecorator: polyline_points = polyline_data.polyline_points else: polyline_points = [] - polyline_verts = [] - polyline_edges = [] + polyline_verts: list[Vector] = [] + polyline_edges: list[list[int]] = [] for point_prop in polyline_points: point = Vector((point_prop.x, point_prop.y, point_prop.z)) polyline_verts.append(point) diff --git a/src/bonsai/bonsai/bim/module/model/polyline.py b/src/bonsai/bonsai/bim/module/model/polyline.py index 2431eb57e5..2154cb73e8 100644 --- a/src/bonsai/bonsai/bim/module/model/polyline.py +++ b/src/bonsai/bonsai/bim/module/model/polyline.py @@ -550,6 +550,8 @@ class PolylineOperator: # TODO Fill doc strings """ """ + objs_2d_bbox: list[tuple[bpy.types.Object, list[float]]] + @classmethod def poll(cls, context: bpy.types.Context) -> bool: return context.space_data.type == "VIEW_3D" diff --git a/src/bonsai/bonsai/tool/raycast.py b/src/bonsai/bonsai/tool/raycast.py index 364269392a..9f4c6fda19 100644 --- a/src/bonsai/bonsai/tool/raycast.py +++ b/src/bonsai/bonsai/tool/raycast.py @@ -62,12 +62,18 @@ class Raycast(bonsai.core.tool.Raycast): return visible_objs @classmethod - def get_on_screen_2d_bounding_boxes(cls, context: bpy.types.Context, obj: bpy.types.Object): + def get_on_screen_2d_bounding_boxes( + cls, context: bpy.types.Context, obj: bpy.types.Object + ) -> Union[tuple[bpy.types.Object, list[float]], None]: obj_matrix = obj.matrix_world.copy() bbox = [obj_matrix @ Vector(v) for v in obj.bound_box] - transposed_bbox = [] - bbox_2d = [] + transposed_bbox: list[Vector] = [] + bbox_2d: list[float] = [] + + assert context.region + assert isinstance(context.space_data, bpy.types.SpaceView3D) + assert context.space_data.region_3d for v in bbox: coord_2d = view3d_utils.location_3d_to_region_2d(context.region, context.space_data.region_3d, v) @@ -77,6 +83,7 @@ class Raycast(bonsai.core.tool.Raycast): region = context.region borders = (0, region.width, 0, region.height) for i, axis in enumerate(zip(*transposed_bbox)): + axis: tuple[float, ...] min_point = min(axis) max_point = max(axis) bbox_2d.extend([min_point, max_point]) @@ -93,7 +100,6 @@ class Raycast(bonsai.core.tool.Raycast): return (obj, bbox_2d) return None - @classmethod def intersect_mouse_2d_bounding_box(cls, mouse_pos: tuple[int, int], bbox: list[float, float, float, float]): x, y = mouse_pos diff --git a/src/bonsai/bonsai/tool/snap.py b/src/bonsai/bonsai/tool/snap.py index ec8be9fdfd..cae1c512b0 100644 --- a/src/bonsai/bonsai/tool/snap.py +++ b/src/bonsai/bonsai/tool/snap.py @@ -25,7 +25,7 @@ import math import mathutils from mathutils import Matrix, Vector from lark import Lark, Transformer -from typing import Union +from typing import Union, Any class Snap(bonsai.core.tool.Snap): @@ -145,12 +145,12 @@ class Snap(bonsai.core.tool.Snap): @classmethod def snap_on_axis(cls, intersection, tool_state): - def create_axis_line_data(rot_mat, origin): + def create_axis_line_data(rot_mat: Matrix, origin: Vector) -> tuple[Vector, Vector]: length = 1000 direction = Vector((1, 0, 0)) if tool_state.plane_method == "YZ" or (not tool_state.plane_method and tool_state.axis_method == "Z"): direction = Vector((0, 0, 1)) - rot_dir = rot_mat.inverted() @ direction + rot_dir: Vector = rot_mat.inverted() @ direction start = origin + rot_dir * length end = origin - rot_dir * length @@ -280,10 +280,16 @@ class Snap(bonsai.core.tool.Snap): return sorted_intersections @classmethod - def detect_snapping_points(cls, context: bpy.types.Context, event: bpy.types.Event, objs_2d_bbox, tool_state): + def detect_snapping_points( + cls, + context: bpy.types.Context, + event: bpy.types.Event, + objs_2d_bbox: list[tuple[bpy.types.Object, list[float]]], + tool_state: tool.Polyline.ToolState, + ) -> list[dict[str, Any]]: rv3d = context.region_data space = context.space_data - detected_snaps = [] + detected_snaps: list[dict[str, Any]] = [] def select_plane_method(): if not last_polyline_point: @@ -485,11 +491,11 @@ class Snap(bonsai.core.tool.Snap): for snap in snapping_points: zoom_factor = bpy.context.region_data.view_distance if snap["type"] == "Vertex": - snap["distance"] *= (zoom_factor / 10) + snap["distance"] *= zoom_factor / 10 if snap["type"] == "Edge Center": - snap["distance"] *= (zoom_factor / 8) + snap["distance"] *= zoom_factor / 8 if snap["type"] == "Edge Intersection": - snap["distance"] *= (zoom_factor / 5) + snap["distance"] *= zoom_factor / 5 if snap["type"] == "Edge": snap["distance"] *= zoom_factor if snap["type"] in ["Plane", "Axis", "Face"]: