import bpy from mathutils import Vector from mathutils.geometry import intersect_line_line_2d def is_over_region(self, context, event): inside = ( 2 < event.mouse_region_x < context.region.width - 2 and 2 < event.mouse_region_y < context.region.height - 2 and [a for a in context.screen.areas if a.as_pointer() == self.adress] and not context.screen.show_fullscreen ) return inside def bound_box_center(ob): points = [ob.matrix_world @ Vector(p) for p in ob.bound_box] x = [v[0] for v in points] y = [v[1] for v in points] z = [v[2] for v in points] return (sum(x) / len(points), sum(y) / len(points), sum(z) / len(points)) def bounding_rect(points): x_points = sorted(p[0] for p in points) y_points = sorted(p[1] for p in points) return [ Vector((x_points[0], y_points[-1])), Vector((x_points[-1], y_points[-1])), Vector((x_points[-1], y_points[0])), Vector((x_points[0], y_points[0])), ] def intersect_rects(rect, border): # returns None if rectangles don't intersect dx = min(border[1][0], rect[1][0]) - max(border[0][0], rect[0][0]) dy = min(border[0][1], rect[0][1]) - max(border[2][1], rect[2][1]) if (dx >= 0) and (dy >= 0): return dx * dy def point_inside_rect(point, rect): return rect[0][0] < point[0] < rect[1][0] and rect[2][1] < point[1] < rect[0][1] def point_over_shape(point, verts, loops, outside_point=(-1, -1)): out = Vector(outside_point) pt = Vector(point) intersections = 0 for loop in loops: for i, p in enumerate(loop): a = Vector(verts[loop[i - 1]]) b = Vector(verts[p]) if intersect_line_line_2d(pt, out, a, b): intersections += 1 if intersections % 2 == 1: # chek if the nb of intersection is odd return True